是否有一种方法可以定义一个命名参数(而不是模型属性)来控制factory.Maybe的行为
例如:我想要创建一个命名的参数,通过一个RelatedFactory (可能是)条件来控制一个的创建,我尝试这样做:
# factories.py
class Purchase(factory.DjangoModelFactory):
user = factory.SubFactory('project.factories.UserFactory')
total = uniform(10, 100)
class Meta:
model = Purchase
class UserFactory(factory.DjangoModelFactory):
first_name = factory.Faker('first_name')
last_name = factory.Faker('last_name')
has_purchase = False
purchases = factory.Maybe(
'has_purchase',
yes_declaration=factory.RelatedFactory(Purchase, 'purchase'),
no_declaration=None
)
class Meta:
exclude = ['has_purchase', 'purchases']
model = User
# tests.py
user_without_purchase = UserFactory.create()
user_with_purchase = UserFactory.create(has_purchase=True)似乎我无法通过命名参数更改has_purchase的值,它总是被设置为False。我不知道这是否因为这两个字段都是在中声明的,排除了元属性。我必须将它们放在中排除,否则DjangoModelFactory在将其保存到数据库时尝试使用这些字段,这会导致完整性错误。
有办法吗?
发布于 2017-11-22 13:20:19
工厂男孩似乎有一个特性,可以提供额外的参数,而不必将这些字段添加到exclude属性:http://factoryboy.readthedocs.io/en/latest/reference.html#simple-parameters
class UserFactory(factory.DjangoModelFactory):
class Params:
has_purchase = False可能和http://factoryboy.readthedocs.io/en/latest/reference.html#lazyattribute一起使用?
发布于 2018-12-04 15:45:06
在阐述Clément Denoix的回答时,我添加了一个可选的参数,将一个值直接传递给子工厂(一种快捷方式,类似于):
class Y_Factory(DjangoModelFactory):
class Meta:
model = Y # has a field named 'z'
class X_Factory(DjangoModelFactory):
class Meta:
model = X # has a foreign key to Y
class Params:
z = None
y = factory.lazy_attribute(lambda o: Y_Factory(z=o.z or 'default_z'))现在,可以将下面的语法X_Factory(y=Y_Factory(z=z))简化为X_Factory(z=z)。
但是有一个警告:使用这种语法会误导新来的人,因为它错误地描述了数据结构。尽管如此,我还是认为,在一个特定的情况下,这样一个快捷方式可以方便地从我的夹具中删除一些烦人的样板代码,这是值得的。
https://stackoverflow.com/questions/47435446
复制相似问题