在models.py中,我有一个带有此字段的模型:
vote_submissions = models.PositiveIntegerField()
在视图中,我最初只是做一个基本的
object.vote_submissions += 1
object.save()
return HttpResponseRedirect(reverse('index'))
因为我仍在学习Django的内容。 据我了解,我应该使用F()表达式? 我在views.py中有此文件,并且可以正常工作(尚未测试)。
from django.db.models import F
Category.objects.filter(id=object.id).update(
vote_submissions=F('vote_submissions') + 1)
return HttpResponseRedirect(reverse('index'))
这是进行此类更新的最有效,最安全的方法吗?
谢谢。
答案 0 :(得分:3)
后者会更快,因为您使用 one 查询进行增量。前者将进行两个查询:一个用于获取对象,并想要更新对象。数据库查询是“昂贵的”,因为通常需要大量工作来构造查询,将查询发送到数据库,让数据库解码和评估查询,将结果发送回并评估结果。这需要很多工作。
重要的不是 首先要获取对象,因为否则我们仍然会进行两个查询(因此更改不会那么重要)。因此,您应该使用主键之类的数据进行过滤,而不是使用id=object.id
。
请注意,您可以使用redirect(..)
[Django-doc]来组合reverse(..)
调用和HttpResponseRedirect
调用的构造,因此可以这样写:
from django.shortcuts import redirect
def some_view(request, pk):
Category.objects.filter(id=pk).update(
vote_submissions=F('vote_submissions')+1
)
return redirect('index')