Для этого вы можете использовать F()
объектов.
Вот как вы импортируете F
: from django.db.models import F
Новое в Django 1.1 .
Призывы к обновлению также могут использовать объекты F () для обновления одного поля на основе значения другого поля в модели. Это особенно полезно для увеличения счетчиков на основе их текущего значения.
Entry.objects.filter(is_published=True).update(views=F('views')+1)
Несмотря на то, что вы не можете выполнить обновление для нарезанного набора запросов ... изменить: на самом деле вы можете ...
Это можно сделать полностью в django ORM. Вам нужно два SQL-запроса:
- Сделай свой фильтр и собери список первичных ключей
- Выполните обновление для нерезанного набора запросов, соответствующих любому из этих первичных ключей.
Трудно получить набор неразрезанных запросов. Я задавался вопросом об использовании in_bulk
, но это возвращает словарь, а не набор запросов. Обычно можно использовать Q objects
для выполнения сложных запросов типа OR, и это будет работать, но pk__in
делает работу намного проще.
latest_entry_ids = Entry.objects.filter(is_published=True)\
.order_by('-date_published')
.values_list('id', flat=True)[:10]
non_sliced_query_set = Entry.objects.filter(pk__in=latest_entry_ids)
n = non_sliced_query_set.update(views=F('views')+1)
print n or 0, 'items updated'
Из-за того, что django лениво выполняет запросы, это приводит к двум попаданиям в базу данных, независимо от того, сколько элементов обновлено.