gpt4 book ai didi

django-rest-framework - 使用与 faker 集成的 factory boy 从名字列表中选择

转载 作者:行者123 更新时间:2023-12-05 01:35:44 24 4
gpt4 key购买 nike

我正在尝试使用 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'])

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

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

我得到的每个名字都是同一家公司,即所有 200 个名字都是“XYZ”。

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

最佳答案

这来自Python的解析规则。

为什么?

当你这样写的时候:

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 的调用仅执行一次

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

那么,你应该怎么做呢?

在这里,你应该使用:

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')factory.fuzzy.FuzzyChoices 的主要区别是 factory.fuzzy.FuzzyChoices 支持懒惰地评估发电机;如果您想从查询集中进行选择,这很有用:

  • factory.Faker('random_choices', elements=Company.objects.all()) 将在导入时执行数据库查询;
  • factory.fuzzy.FuzzyChoice(Company.objects.all()) 只会在第一次调用 UserFactory.create() 时查询数据库。

关于django-rest-framework - 使用与 faker 集成的 factory boy 从名字列表中选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62724145/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com