2016-03-28 3 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

Вам нужно назначить объект QuerySet к своему собственному istance, а затем она сохранит, что вы делаете выше только редактирование предмету QuerySet

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

Спасибо, да это работает. Почему это происходит? Я весьма озадачен. –

+0

это потому, что объекты в Queryset не сохраняются в памяти, а запрос - просто копия объектов. Чтобы получить фактический объект (т. Е. Чтобы его можно было обновить и сохранить), вам нужно назначить его переменной в памяти – awwester

+0

Не совсем; это потому, что каждая операция среза выполняет новый запрос к базе данных и возвращает новый объект. Поэтому первый 'c [1]' не связан с последующими. –

Смежные вопросы