我正在使用 factory_boy
在 Django 中构建一些固定装置。
我想使用 factory.LazyAttribute
根据另一个属性的条件构建一个属性。
class MyFactory(factory.django.DjangoModelFactory):
class Meta:
model = MyModel
title = 'My Title' if random() < 0.5 else None
description = factory.LazyAttribute(
lambda a: factory.Faker(
'paragraph', nb_sentences=1, variable_nb_sentences=False
) if a.title else None)
但是,这会返回 string
正在 <factory.faker.Faker object at 0x000001B10597BB20>
而不是执行正确的段落生成。
我哪里错了?
最佳答案
factory.Faker
是一个特殊的对象:当工厂实例化一个对象时,它会询问 factory.Faker
代理从faker获取随机值。
实现您所寻找的最简单的方法是使用 factory.Maybe
:
class MyFactory(factory.django.DjangoModelFactory):
class Meta:
model = MyModel
title = factory.fuzzy.FuzzyChoice(["My Title", None])
description = factory.Maybe('title', factory.Faker('paragraph'))
请注意,在您共享的代码中,title = "My title" if random() < 0.5 else None
当 Python 解析文件时,只计算一次。我用过 factory.fuzzy.FuzzyChoice
为每个对象执行随机计算。此函数还使用 factory_boy's randomness management features .
另一种选择是使用 parameters ( class Params
) :
class MyFactory(factory.django.DjangoModelFactory):
class Meta:
model = MyModel
class Params:
# Items here will be available to further declarations, but won't be
# passed to the model constructor.
description_contents = factory.Faker('paragraph')
title = factory.fuzzy.FuzzyChoice(["My Title", None])
description = factory.LazyAttribute(lambda a: a.description_contents if a.title else None)
关于python - 如何将 factory.LazyAttribute 与 Faker() 函数一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62756086/