我的索引视图中有以下代码。
latest_entry_list = Entry.objects.filter(is_published=True).order_by('-date_published')[:10] for entry in latest_entry_list: entry.views = entry.views + 1 entry.save()
如果从初始查询返回十行(限制),保存将发出10个单独的更新的数据库调用,还是Django的“智能”足以发出一个更新调用?
有没有更有效的方法来达到这个结果?
你可以F()为此使用对象。
这是你的导入方式F:from django.db.models import 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
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懒惰地执行查询的方式,无论更新多少项目,这只会导致2次数据库命中。