这是我的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。
答案 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
无关:正常的创建/保存会遇到完全相同的问题。