如何在 factory-boy 中使用 create_batch 时为属性设置序列?

Saš*_*aba 5 python testing django pytest factory-boy

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

模型.py

class TestModel(models.Model):
    name = CharField()
    order = IntegerField()
Run Code Online (Sandbox Code Playgroud)

食谱.py

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

    name = factory.LazyAttribute(lambda o: faker.word().title())
    order = 0
Run Code Online (Sandbox Code Playgroud)

测试.py

recipes.TestModelFactory.create_batch(4, order=+10)
Run Code Online (Sandbox Code Playgroud)

或者

recipes.TestModelFactory.create_batch(4, order=seq(10))
Run Code Online (Sandbox Code Playgroud)

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

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

[10, 20, 30, 40]
Run Code Online (Sandbox Code Playgroud)

更新

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)
Run Code Online (Sandbox Code Playgroud)

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

一种解决方法是:

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

    name = factory.LazyAttribute(lambda o: faker.word().title())
    order = 0
Run Code Online (Sandbox Code Playgroud)

然后在测试中:

    recipes.MenuItemFactory.reset_sequence(1)

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

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

Fal*_*int 8

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

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

 MyModelFactory.create_batch(
     9,
     sort_order=factory.Sequence(lambda n: 10-n))
Run Code Online (Sandbox Code Playgroud)