Django get_or_create方法不返回确切的对象

时间:2014-09-05 08:44:16

标签: django django-models

这是我的models.py

class Foo(models.Model):
    id = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=30)

在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'}

此处的问题是自定义id属性没有值。如果我继续做以下事情:

>>> c = foo.objects.get(name='hi')
>>> c.id
1
>>> a is c
False

所以新创建的对象(由c表示)现在已经存在,但b并不像c那样是对它的精确引用。

这是一个错误吗?我的django版本是1.6.5。

2 个答案:

答案 0 :(得分:4)

默认情况下,如果您没有为模型指定id字段,Django will create自动字段:

id = models.AutoField(primary_key=True)

在您的情况下,您只创建了IntegerField。我想这就是重点。在数据库中,它仍然会递增,但是django不会将id值从数据库分配给对象,由get_or_create返回

顺便问一下,在你的问题中:

>>> b is c
False

b - 是一个bool值。我想你正在努力做到

>>> a is c

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

>>> a == c

无论如何,您将获得False,因为a的{​​{1}}设置为id

答案 1 :(得分:2)

您已将您的id字段声明为IntegerField,因此Django不知道它需要自动增量。您可以将其定义为AutoField,但实际上根本没有理由声明它:如果您将其删除,Django会自动为您定义它。

请注意,这与get_or_create无关:正常的创建/保存会遇到完全相同的问题。