Django Factory男孩用法

时间:2017-05-25 12:47:15

标签: python django python-3.x factory-boy

鉴于以下模型:

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引用具有有效A属性的实际foo实体?

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

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

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

这可能吗?

1 个答案:

答案 0 :(得分:1)

你只需要从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上定义工厂字段。这可以通过上面的继承轻松完成。