如何使用工厂男孩创建一个在用户上有 Fk 的实例?

How to create a instance that have Fk on User with factory boy?

我正在尝试为用户模型模拟具有 FK 的资源对象,但是当我实例化 class o 时出现错误:

bf = BenefitFactory()

AttributeError: type object 'UserFactory' has no attribute '_meta'

工厂:

class UserFactory:
    class Meta:
        model = User

    first_name = factory.Faker('first_name')
    last_name = factory.Faker('last_name')
    username = factory.Faker('email')
    password = factory.LazyFunction(lambda: make_password('pi3.1415'))
    is_staff = False
    is_superuser = False


class BenefitFactory(factory.django.DjangoModelFactory):

    class Meta:
        model = Benefit

    user = factory.SubFactory(UserFactory)

我也试过这样使用方法RelatedFactory

class BenefitFactory(factory.django.DjangoModelFactory):

    class Meta:
        model = Benefit

    user = factory.RelatedFactory(UserFactory, 'user')

但后来我收到错误消息:

django.db.utils.IntegrityError: null value in column "user_id" violates not-null constraint

我如何创建一个 Benefit 与用户相关的对象?

第一个错误是因为您的 UserFactory 没有继承自 factory.django.DjangoModelFactory!

第二次,RelatedFactory 在 将 Benefit 保存到数据库后运行 ;但是由于您的 Benefit 模型具有 ForeignKeyUser,您 必须 在创建 [=14] 时提供 User 的实例=] — 这是使用 SubFactory 完成的,就像在您的初始版本中一样!

因此,修复方法很简单:

class UserFactory(factory.django.DjangoModelFactory):
    ...


class BenefitFactory(factory.django.DjangoModelFactory):
    ...

    user = factory.SubFactory(UserFactory)