Django对象改变模型字段

Lak*_*sad 2 python django django-models

这不起作用:

>>> pa = Person.objects.all()
>>> pa[2].nickname
u'arst'
>>> pa[2].nickname = 'something else'
>>> pa[2].save()
>>> pa[2].nickname  
u'arst'
Run Code Online (Sandbox Code Playgroud)

但是,如果你服用,它就有效

   p = Person.objects.get(pk=2)
Run Code Online (Sandbox Code Playgroud)

并改变缺口.

为什么这样.

And*_*yuk 10

>>> type(Person.objects.all())
<class 'django.db.models.query.QuerySet'>

>>> pa = Person.objects.all() # Not evaluated yet - lazy
>>> type(pa)
<class 'django.db.models.query.QuerySet'>
Run Code Online (Sandbox Code Playgroud)

DB查询给你一个Person对象

>>> pa[2]
Run Code Online (Sandbox Code Playgroud)

DB再次查询给你另一个Person对象.

>>> pa[2].first_name = "Blah" 
Run Code Online (Sandbox Code Playgroud)

我们将此实例称为驻留在内存中的PersonObject1.所以它相当于这样的东西:

>>> PersonObject1.first_name = "Blah"
Run Code Online (Sandbox Code Playgroud)

现在让我们这样做:

>>> pa[2].save() 
Run Code Online (Sandbox Code Playgroud)

pa [2]再次查询db并返回person对象的另一个实例,例如PersonObject2.哪个会保持不变!所以它与调用类似的东西是等价的:

PersonObject2.save()
Run Code Online (Sandbox Code Playgroud)

但这与PersonObject1无关.


ken*_*der 5

如果您将您分配pa[2]给一个变量,就像您所做的那样,那么Person.objects.get(pk=2)您的做法是正确的:

pa = Person.objects.all()
print pa[2].nickname
'Jonny'
pa[2].nickname = 'Billy'
print pa[2].nickname
'Jonny'

# when you assign it to some variable, your operations 
# change this particular object, not something that is queried out each time
p1 = pa[2]
print p1.nickname 
'Jonny'
p1.nickname = 'Billy'
print p1.nickname 
'Billy'
Run Code Online (Sandbox Code Playgroud)

这与从数据库中提取对象的方法无关。

而且,顺便说一句,django 的 PrimaryKeys 从 1 开始,而不是从 0 开始,所以

Person.objects.all()[2] == Person.objects.get(pk=2)
False
Person.objects.all()[2] == Person.objects.get(pk=3)
True
Run Code Online (Sandbox Code Playgroud)

  • 提及 all() 是一个 QuerySet,而不是实际的列表会很有帮助。http://docs.djangoproject.com/en/dev/topics/db/queries/#retrieve-all-objects (3认同)