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无关.
如果您将您分配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)
| 归档时间: |
|
| 查看次数: |
4798 次 |
| 最近记录: |