2016-03-28 11 views
1

私はcreated_atフィールドを持つクライアントモデルを持っています。私は、クライアントのcreated_atをシェルから更新したいと思っています。私は次のようでした:インデックスによるDjango Querysetのアクセス

>>> c = Client.objects.all() 
>>> c[1].created_at 
>>> # I get nothing here since it's not set yet 
>>> from django.utils import timezone 
>>> c[1].created_at = timezone.now() 
>>> c[1].save() 
>>> c[1].created_at 
>>> # I still get nothing here. Even when I reload the queryset, I get nothing. 

しかし、私はc = Client.object.get(id=1)と同じことを行うとき、それは動作します。なぜこれが起こるのですか?

答えて

4

あなたは、その独自のistanceにクエリセットオブジェクトを割り当てる必要がありますし、それが何を上記のやっていることがちょうどクエリセットアイテムに

c = Client.objects.all() 
obj = c[1] 
obj.created_at = timezone.now() 
obj.save() 
+0

感謝を編集して、保存されます、はい、それは動作します。なぜこれは起こるのですか?私は困惑している。 –

+0

これは、クエリーセット内のオブジェクトがメモリに保存されず、クエリーセットがオブジェクトのコピーにすぎないためです。実際のオブジェクトを取得する(つまり、オブジェクトを更新して保存する)には、メモリ内の変数に割り当てる必要があります。 – awwester

+0

実際はありません。すべてのスライス操作でデータベースに新しいクエリが実行され、新しいオブジェクトが返されるからです。したがって、最初の 'c [1]'は後続の 'c [1]'に接続されていません。 –

関連する問題