2016-03-28 59 views
1

我有一個created_at字段的客戶端模型。我想從shell更新客戶端的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

這是因爲Queryset中的對象沒有保存在內存中,查詢集只是對象的副本。要獲得實際的對象(即能夠更新並保存它),您需要將其分配給內存中的變量。 – awwester

+0

不是真的;這是因爲每個切片操作都會對數據庫執行新的查詢並返回一個新對象。所以第一個'c [1]'沒有連接到後面的。 –