使用与 faker 集成的 Factory Boy 从名称列表中进行选择

2023-12-13

我正在尝试使用factory.faker从四家公司的列表中随机选择,并将它们用作生成名称列表的流量源。我正在使用下面的代码:

    from django.db import models
    import factory
    import factory.django
    from datetime import datetime
    from django.core.validators import MinValueValidator, MaxValueValidator
    from faker import Faker
    from faker.providers import BaseProvider
    import random

    fake = Faker()

    class User(models.Model):
        name = models.CharField(max_length=64)
        address = models.CharField(max_length=128)
        phone_number = models.CharField(max_length=32)
        login_date = models.DateTimeField(default=datetime.now(), blank=True)
        session_duration = models.IntegerField(default = 0, validators=  [
                           MinValueValidator(0),
                           MaxValueValidator(5)
                           ])
        traffic_source = models.CharField(max_length=32)

    class UserFactory(factory.django.DjangoModelFactory):
        class Meta:
            model = User

        name = factory.Faker('name')
        address = factory.Faker('address')
        phone_number = factory.Faker('phone_number')
        login_date = factory.Faker('date')
        session_duration = factory.Faker('random_int')



        traffic_source = random.choice(['XYZ', 'ABC', '123', '456'])

问题是,对于所有 200 次迭代,我在 python shell 中使用以下命令执行:

    for _ in range(200): 
        UserFactory.create()

我为每个名称都提供了同一家公司,即所有 200 个名称都为“XYZ”。

我错过了什么吗?我想为这 200 次迭代中的每一次都找一家不同的公司。任何帮助深表感谢。谢谢你!


这来自于Python的解析规则。

Why?

当你写下这个:

class UserFactory(factory.django.DjangoModelFactory):
    ...
    traffic_source = random.choice(['XYZ', 'ABC', '123', '456'])

Python将执行以下步骤:

  1. 阅读类声明体;
  2. 到达终点线traffic_source = random.choice(['XYZ', 'ABC', '123', '456']);
  3. 评估调用random.choice,这可能会返回'ABC';
  4. 读取类主体的每一行(并评估其函数调用)后,创建该类:
    UserFactory = type(
        name='UserFactory',
        bases=[factory.django.DjangoModelFactory],
        {'traffic_source': 'ABC', ...},
     )```
    
    

如您所见,调用random.choice仅执行once,在解析类声明时。

这基本上就是所有问题的原因factory.XXX声明:它们生成一个对象,该对象仅在从工厂构建实例时执行其特定规则。

那你该怎么办?

在这里,您应该使用:

  • Either factory.Faker using Faker's random_choices提供者;
  • Or factory.fuzzy.FuzzyChoice:
class UserFactory(factory.django.DjangoModelFactory):
    ...
    traffic_source = factory.Faker('random_choices', elements=['XYZ', 'ABC', '123', '456'])
    alt_traffic_source = factory.fuzzy.FuzzyChoice(['XYZ', 'ABC', '123', '456'])

之间的主要区别factory.Faker('random_choices') and factory.fuzzy.FuzzyChoices就是它factory.fuzzy.FuzzyChoices支持延迟评估生成器;如果您想从查询集中进行选择,这很有用:

  • factory.Faker('random_choices', elements=Company.objects.all())将在导入时执行数据库查询;
  • factory.fuzzy.FuzzyChoice(Company.objects.all())只会在第一次查询数据库UserFactory.create()叫做。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用与 faker 集成的 Factory Boy 从名称列表中进行选择 的相关文章

随机推荐

  • 为什么malloc是16字节对齐的?

    The GNU文件指出malloc在 64 位系统上与 16 字节倍数对齐 为什么是这样 如果我的理解是正确的 寄存器和所有指令都对最大 8 字节宽的值进行操作 因此 似乎需要 8 字节对齐 Notes 我找到了一些理由来解释为什么堆栈指针
  • 贾斯珀报告空白页

    我的 jrxml 和 java 代码如下 我正在尝试创建包含一些文本和值的报告 但是会生成空白报告 我正在传递地图来填充报告作为参数 我必须添加 4 5 条静态行 然后添加一个动态变量 我已经在详细的乐队中添加了这些东西 出了什么问题
  • Pythonplotly表达具有累积和的折线图

    本质上 我想绘制数据的折线图y x g 也就是说我想分别绘制 y 的累积和并按组着色 而不必将它们添加到数据中 为什么 因为我想绘制很多这样的列 并且我不想为每个列添加累积列 考虑以下示例 import pandas as pd df pd
  • Android 在哪里可以获取本机相机应用程序拍摄的图像

    我正在使用本机相机应用程序来捕获图像 并且我没有使用 MediaStore EXTRA OUTPUT 来指定图像的路径 那么我如何使用意图来获取图像 Thanks 要使用相机捕获图像 请调用此意图 Intent cameraIntent n
  • 通过 Python 使用 Selenium 搜索后找不到抓取结果表的方法

    我用 BeautifulSoup Selenium 和 Scrapy 做 webscrape 已经几个月了 主要是为了研究目的 经过起起伏伏后 我总是设法实现我的网络抓取目标 其中很多归功于这个网站 直到我面对这个网站 https eucl
  • 如何从 diff 应用程序读取 app.config 中的用户设置?

    我有一个带有 App config 的 WinForms exe 其中有一堆在运行时设置并保存的用户范围设置 我希望能够使用 WinForms 应用程序更改并保存设置 然后单击按钮根据这些设置执行一些工作 我还想读取 9 月份同一 conf
  • 在 Android Studio 中找不到默认 Activity

    我刚刚升级到 Android Studio 0 2 8 当我尝试编辑运行配置时 收到一条错误消息 未找到默认活动 当我启动 Android Studio 时 出现此错误 仅允许从事件调度线程访问 我正在使用的活动是片段活动 到目前为止 我已
  • POI:将行追加到现有工作簿

    使用 XSSFWorkbook 是否可以将行附加到现有工作表 我正在进行多次写入 由于错误 这是一个需要解决的 PITA 虽然我可以多次写出新的工作表 但似乎我无法附加 我目前正在做的事情如下 阅读我的工作簿中的工作表 加载工作簿 将行追加
  • Cmake基本库链接问题

    我在将库与 CMake 链接时遇到一个简单的问题 我不太了解 CMake 我的配置如下 project src CMakeLists txt with all cpp and h files project support linux gm
  • WPF MVVM - 如何在单击按钮时显示 MainWindowViewModel 的视图[重复]

    这个问题在这里已经有答案了 可能的重复 使用 MVVM 在 WPF 中创建新窗口的最佳方法 大家好 我有两种看法主窗口视图 and 添加客户视图 我的菜单包含 Mainwindow View xml 中的按钮 我怎么能弹出通过单击按钮从 M
  • 如何从浮动操作按钮中删除那些深色圆形背景?

    我无法从浮动操作按钮中删除那些黑圈背景 默认情况下 它有一个带有圆形阴影的圆形按钮 但有些人找不到去除这种阴影的方法 xmlns app http schemas android com apk res auto xmlns tools h
  • 复制构造函数和私有成员的混淆

    假设我有以下课程 class Test int num public Test int x num x Test const Test rhs num rhs num 1 int main Test test 10 Test copy te
  • 当我的 MS Graph API 邮件搜索未找到结果时,为什么我会收到网关超时消息?

    从本周开始我突然变得gateway timeout当我的邮件搜索没有找到结果时 从图表中 我正在使用这样的查询 https graph microsoft com v1 0 users email protected mailFolders
  • 增加点击按钮的计数

    var index 0 默认情况下 index 的值为 0 现在我有两个按钮 当我单击按钮 2 或 1 时 index 的值应该增加 单击时的第二个按钮应将值从一开始 类似地第三个按钮 依此类推 你需要一个函数来做到这一点 function
  • PHP - 表单动作调用自身,如何在一页中显示所有内容?

    我有两个 php 文件 测试1 php
  • 如何在Spring配置文件中为bean的属性分配Enum值?

    我定义了一个独立的枚举类型 如下所示 package my pkg types public enum MyEnumType TYPE1 TYPE2 现在 我想将该类型的值注入到 bean 属性中
  • 如何创建文件夹、共享和应用NTFS权限

    作为 Powershell 的新手 我尝试使用来自各种 TechNet 脚本示例的以下脚本来编写一个脚本 FolderPath c folder Shares WMICLASS WIN32 Share ShareName Home New
  • Java SE 8 有对或元组吗?

    我正在玩 Java SE 8 中的惰性函数操作 我想map一个索引i到一对 元组 i value i then filter基于第二个value i 元素 最后只输出索引 难道我还要受这样的苦吗 Java 中的 C Pair 相当于什么 在
  • 继续已中止的 AJAX (jqXHR) 请求

    是否可以继续已中止的 AJAX jqXHR 请求 就像是 document ajaxSend function event jqXHR ajaxOptions if it enters my conditions current reque
  • 使用与 faker 集成的 Factory Boy 从名称列表中进行选择

    我正在尝试使用factory faker从四家公司的列表中随机选择 并将它们用作生成名称列表的流量源 我正在使用下面的代码 from django db import models import factory import factory