ali*_*s51 5 python django faker factory-boy
我正在使用factory_boyDjango 构建一些固定装置。
我想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)
Run Code Online (Sandbox Code Playgroud)
然而,这返回一个string存在<factory.faker.Faker object at 0x000001B10597BB20>而不是执行正确的段落生成。
我哪里出错了?
小智 9
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'))
Run Code Online (Sandbox Code Playgroud)
请注意,在您共享的代码中,title = "My title" if random() < 0.5 else None当 Python 解析文件时, 只计算一次。我曾经factory.fuzzy.FuzzyChoice对每个对象执行随机计算。该函数还利用了factory_boy的随机性管理功能。
另一种选择是使用参数 ( 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)
Run Code Online (Sandbox Code Playgroud)
或者,如果您需要与 Faker 库进行更具体的交互:
from faker import Faker as RealFaker
real_faker = RealFaker()
Run Code Online (Sandbox Code Playgroud)
工厂内部:
factory.LazyAttribute(lambda a: real_faker.email())
Run Code Online (Sandbox Code Playgroud)