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。
默认情况下,如果您尚未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。