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)
在djangomanage.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