【问题标题】:How to setup a sequence for an attribute while using create_batch in factory-boy?如何在 factory-boy 中使用 create_batch 时为属性设置序列?
【发布时间】:2018-08-30 14:54:23
【问题描述】:

在 Django 中使用 factory_boy 时,我该如何实现?

models.py

class TestModel(models.Model):
    name = CharField()
    order = IntegerField()

食谱.py

class TestModelFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = TestModel

    name = factory.LazyAttribute(lambda o: faker.word().title())
    order = 0

tests.py

recipes.TestModelFactory.create_batch(4, order=+10)

recipes.TestModelFactory.create_batch(4, order=seq(10))

或类似的东西,以达到这个结果:

TestModel.objects.all().values_list('order', flat=True)

[10, 20, 30, 40]

更新

Ty @trinchet 的想法。所以我想一种解决方案是:

class TestModelFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = TestModel

    name = factory.LazyAttribute(lambda o: faker.word().title())
    order = factory.Sequence(lambda n: n * 10)

但这总是会在我的所有对象上设置序列,而我无法设置我想要的值。

一种解决方法是:

class TestModelFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = TestModel

    name = factory.LazyAttribute(lambda o: faker.word().title())
    order = 0

然后在测试中:

    recipes.MenuItemFactory.reset_sequence(1)

    recipes.MenuItemFactory.create_batch(
        4,
        parent=self.section_menu,
        order=factory.Sequence(lambda n: n * 10)
    )

这会给我想要的结果。但这会重置所有序列。我希望它能够为订单动态设置顺序。

【问题讨论】:

  • 您只希望create_batch 使用这个吗?为什么不在工厂里做order = factory.Sequence(lambda n: n * 10)

标签: python django testing pytest factory-boy


【解决方案1】:

以防万一有人觉得它有帮助。

我发现这篇文章试图实现负排序顺序。并且仅在 create_batch 调用中。 所以我的用例是

 MyModelFactory.create_batch(
     9,
     sort_order=factory.Sequence(lambda n: 10-n))

【讨论】:

    猜你喜欢
    • 2019-11-05
    • 2021-03-01
    • 1970-01-01
    • 2020-05-03
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    • 2017-12-17
    • 2020-10-06
    相关资源
    最近更新 更多