factory_boy对象似乎缺少主键

时间:2013-09-23 15:47:16

标签: python django django-models factory-boy

当我创建factory_boy对象时,该对象似乎没有主键,我不知道为什么。这是我的模特和工厂:

# models.py
from django.db import models
from django.contrib.auth.models import User

class UserProfile(models.Model):
    # UserProfile is a subset table of User.  They have a 1:1 relationship.
    user = models.ForeignKey(User, unique=True)
    gender = models.CharField(max_length=1)

# factories.py
import factory
from django.contrib.auth.models import User
from .models import UserProfile

class UserFactory(factory.Factory):
    FACTORY_FOR = User
    username = 'jdoe'

class UserProfileFactory(factory.Factory):
    FACTORY_FOR = UserProfile
    user = factory.lazy_attribute(lambda a: UserFactory())
    gender = 'M'

现在根据关联的factory_boy documentation,如果我创建一个User实例,我应该得到一个'id'字段。但是,我没有。这就是我得到的(在翻译中):

>>> from app.factories import UserFactory, UserProfileFactory
>>> user = UserFactory()
>>> user.username  # This result is correct
'jdoe'
>>> user.id is None   # User should be 'saved' and so this should return False
True

类似地:

>>> user_profile = UserProfileFactory()
>>> user_profile.gender   # This is OK
'M'
>>> user_profile.user     # This is OK
<User: jdoe>
>>> user_profile.id is None  # Why isn't this False?
True

文档说这些user.id和user_profile.id命令应该返回'False'而不是'True',因为我正在创建(而不是构建)factory_boy实例。我在这里错过了什么?为什么我在创建这些实例时没有获得'id'值?似乎我能获得id的唯一方法是在我的工厂中明确创建一个'id'属性。但是,我没有在文档中的任何地方看到这样做,所以我认为这不是你应该做的。

感谢。

2 个答案:

答案 0 :(得分:15)

对于django支持,您需要使用DjangoModelFactory

https://factoryboy.readthedocs.org/en/latest/orms.html#the-djangomodelfactory-subclass

答案 1 :(得分:4)

为了完整起见,还值得注意的是,为了明确地将工厂保存到数据库,文档说您可以使用:

user = UserProfile.create()
一旦你使用DjangoModelFactory的子类,

就会做同样的事情:

user = UserProfile()

只有当对象保存到数据库时才会收到PK。

要创建工厂并明确不将其保存到数据库,请使用:

user = UserProfile.build()