Django的get_or_create方法没有返回确切的对象

wln*_*ana 3 django django-models

这是我的models.py

class Foo(models.Model):
    id = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=30)
Run Code Online (Sandbox Code Playgroud)

在Django中manage.py shell

>>> a,b = Foo.objects.get_or_create(name='hi')
>>> b
True
>>> vars(a)
{'_state': <django.db.models.base.ModelState object at 0x02761390>, 'id': None,
'name': 'hi'}
Run Code Online (Sandbox Code Playgroud)

这里的问题是定制id属性没有价值。如果我继续执行以下操作:

>>> c = foo.objects.get(name='hi')
>>> c.id
1
>>> a is c
False
Run Code Online (Sandbox Code Playgroud)

因此,新创建的对象(由表示c)已经存在,但b并没有像现在这样精确地引用它c

这是错误吗?我的Django版本是1.6.5。

sta*_*alk 5

默认情况下,如果您尚未id为模型指定字段,则Django将创建 AutoField:

id = models.AutoField(primary_key=True)
Run Code Online (Sandbox Code Playgroud)

就您而言,您已经创建了IntegerField。我想这就是重点。在数据库中,它仍然会增加,但是django不会将id数据库中的值分配给对象,返回值是get_or_create

顺便说一句,在您的问题:

>>> b is c
False
Run Code Online (Sandbox Code Playgroud)

b-是布尔值。我想你在努力

>>> a is c
Run Code Online (Sandbox Code Playgroud)

但这也不是一个好主意。如果要比较Django模型对象,请使用==,而不是is

>>> a == c
Run Code Online (Sandbox Code Playgroud)

你会得到False反正a有其id设置为None