Django get_或_create方法不';不返回精确对象

Django get_或_create方法不';不返回精确对象,django,django-models,Django,Django Models,这是我的型号.py: class Foo(models.Model): id = models.IntegerField(primary_key=True) name = models.CharField(max_length=30) 在djangomanage.py shell中: >>> a,b = Foo.objects.get_or_create(name='hi') >>> b True >>> vars(a) {

这是我的
型号.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'}
因此新创建的对象(由
c
表示)现在已经存在,但是
b
不像
c
那样是对它的精确引用


这是虫子吗?我的django版本是1.6.5。

您已将id字段声明为整数字段,因此django不知道它需要自动递增。您可以将它定义为一个AutoField,但实际上根本没有理由声明它:如果您不使用它,Django将自动为您定义它


注意:这与“获取”或“创建”无关:正常的“创建/保存”也会出现同样的问题。

默认情况下,如果没有为模型指定“id”字段,则“自动字段”:

id = models.AutoField(primary_key=True)
在本例中,您只创建了
IntegerField
。我想这就是重点。在数据库中,它仍将递增,但django不会将数据库中的
id
值分配给对象,该值由
get\u或\u create

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

>>> b is c
False
b
-是布尔值。我想你是想这么做

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

>>> a == c

无论如何,您将得到
False
,因为
a
id
设置为
None

为什么您要将
b
c
进行比较
b
是布尔值“created”,由
get\u或\u create
返回,
c
是对象。@cold对此表示抱歉。刚刚更正,问题仍然存在。不知道需要自动递增是什么意思?我仍然得到
c.id==1
。尝试使用没有id字段的相同模型。(它是自动创建的!)
>>> a == c