2009-05-26 4 views

答えて

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'> 

DBはDBはあなたを与えるために再び照会あなたにPersonオブジェクトを与えること

>>> pa[2] 

を照会さらに別のPersonオブジェクト

>>> pa[2].first_name = "Blah" 

このインスタンスをメモリ内にあるPersonObject1としましょう。だから、このようなものと同等です:

>>> PersonObject1.first_name = "Blah" 

今度は、これを実行してみましょう:

>>> pa[2].save() 

PA [2]再びデシベルのANを照会する人物オブジェクトの別のインスタンスを返し、例えばPersonObject2を言います。どちらが変わりません!したがって、次のようなものを呼び出すのと同等です。

PersonObject2.save() 

しかし、これはPersonObject1とは関係ありません。

+0

非常によく説明されています!ありがとう! –

4

あなた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' 

これは、データベースからオブジェクトを引く方法とは何の関係もありません。

そして、1から始まるところで、ジャンゴ番号PrimaryKeys、0でないので、

Person.objects.all()[2] == Person.objects.get(pk=2) 
False 
Person.objects.all()[2] == Person.objects.get(pk=3) 
True 
+0

+1非常に有益な情報(特に最後の部分...) –

+3

all()は実際のリストではなく、QuerySetです。 http://docs.djangoproject.com/en/dev/topics/db/queries/#retrieving-all-objects –

+0

それを指摘してくれてありがとう – kender

2

Person.objects.all()は、怠け者である(データが要求されるまでDBクエリを実行しない)QuerySetを返します。 QuerySet(pa [2])をスライスすると、(SQLのLIMITとOFFSETを使用して)データベースから単一の行を取得するデータベースクエリが実行されます。再度QuerySetをスライスしてもDBクエリは再度実行されず(結果はキャッシュされます)、モデルの新しいインスタンスが返されます。 pa [2]にアクセスするたびに、新しいPersonインスタンスが取得されます(ただし、すべて同じデータが格納されています)。