如何解决Django:将博客条目视图增加1这样有效吗?
您可以F()
为此使用对象。
这是您的导入方式F
:from django.db.models import F
调用更新也可以使用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懒惰地执行查询的方式,无论更新多少项目,这只会导致2次数据库命中。
解决方法
我的索引视图中有以下代码。
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的“智能”足以发出一个更新调用?
有没有更有效的方法来达到这个结果?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。