在Django的视图中增加PositiveIntegerField的最有效方法是什么?

时间:2019-12-19 09:05:31

标签: python django database

在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'))

这是进行此类更新的最有效,最安全的方法吗?
谢谢。

1 个答案:

答案 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')