首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django + Factory Boy:如何使用命名参数来控制factory.Maybe + factory.RelatedFactory的行为

Django + Factory Boy:如何使用命名参数来控制factory.Maybe + factory.RelatedFactory的行为
EN

Stack Overflow用户
提问于 2017-11-22 13:03:08
回答 2查看 5.3K关注 0票数 3

是否有一种方法可以定义一个命名参数(而不是模型属性)来控制factory.Maybe的行为

例如:我想要创建一个命名的参数,通过一个RelatedFactory (可能是)条件来控制一个的创建,我尝试这样做:

代码语言:javascript
复制
# 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在将其保存到数据库时尝试使用这些字段,这会导致完整性错误。

有办法吗?

EN

回答 2

Stack Overflow用户

发布于 2017-11-22 13:20:19

工厂男孩似乎有一个特性,可以提供额外的参数,而不必将这些字段添加到exclude属性:http://factoryboy.readthedocs.io/en/latest/reference.html#simple-parameters

代码语言:javascript
复制
class UserFactory(factory.DjangoModelFactory):
    class Params:
        has_purchase = False

可能和http://factoryboy.readthedocs.io/en/latest/reference.html#lazyattribute一起使用?

票数 4
EN

Stack Overflow用户

发布于 2018-12-04 15:45:06

在阐述Clément Denoix的回答时,我添加了一个可选的参数,将一个值直接传递给子工厂(一种快捷方式,类似于):

代码语言:javascript
复制
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)

但是有一个警告:使用这种语法会误导新来的人,因为它错误地描述了数据结构。尽管如此,我还是认为,在一个特定的情况下,这样一个快捷方式可以方便地从我的夹具中删除一些烦人的样板代码,这是值得的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47435446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档