Django Factory Boy 用法

Django Factory boy usage

给定以下模型:

from django.db import models


class A(models.Model):
    foo = models.TextField()


# B inherits from A, it's not abstract so it should 
# create a table with a foreign key relationship
class B(A):
    bar = models.TextField()

以及 DjangoModel 工厂的以下测试:

from django.test import TestCase
import factory
from factory.django import DjangoModelFactory
from .models import A, B


class AFactory(DjangoModelFactory):
    foo = factory.Faker('name')

    class Meta:
        model = A


class BFactory(DjangoModelFactory):
    bar = factory.Faker('name')

    class Meta:
        model = B


class BTestCase(TestCase):
    def test_1(self):
        b = BFactory()
        print(b.foo)  # prints ''

如何让 b.foo 引用具有有效 foo 属性的实际 A 实体?

目前 b.foo 只是 returns 一个空字符串。但是如果我使用 AFactory 创建一个 A 实体,该实体有一个正确填充的 foo 字段:

>>> a_ent = AFactory()
>>> a_ent.foo
'Nicholas Williams'

我希望 BFactory 为我创建一个 b 可以引用的 A 实体。

这可能吗?

您只需要从 AFactory 扩展 BFactory:

class AFactory(DjangoModelFactory):
    foo = factory.Faker('name')

    class Meta:
        model = A


class BFactory(AFactory):
    bar = factory.Faker('name')

    class Meta:
        model = B

b = BFactory()
print(b.foo)  # Robert Rogers
print(b.bar)  # Maria Clark

BFactory 用于通过 B 模型创建数据库记录,因此为此需要在 BFactory 上定义工厂字段。这可以通过上面的继承轻松完成。