您可以使用F()
个对象来完成此操作.
以下是如何导入F
:from django.db.models import F
100.
调用update还可以使用F()对象基于模型中另一个字段的值更新一个字段.这对于根据计数器的当前值递增计数器特别有用.
Entry.objects.filter(is_published=True).update(views=F('views')+1)
虽然您不能对切片查询集进行更新.edit: actually you can...个
这完全可以在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个数据库命中.