我正在尝试使用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将执行以下步骤:
- 阅读类声明体;
- 到达终点线
traffic_source = random.choice(['XYZ', 'ABC', '123', '456'])
;
- 评估调用
random.choice
,这可能会返回'ABC'
;
- 读取类主体的每一行(并评估其函数调用)后,创建该类:
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(使用前将#替换为@)