我在 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'))
这是进行此类更新的最有效和最安全的方法吗?
谢谢。
最佳答案
后者会更快,因为您使用一个查询进行增量。前者将进行两个查询:一个是获取对象,另一个是想要更新该对象。数据库查询是“昂贵的”,因为通常需要大量工作来构建查询、将查询发送到数据库、让数据库解码和评估查询、发回结果并评估结果。这需要大量工作。
重要的是不要首先获取对象,因为否则我们仍然会进行两个查询(因此更改不会那么重要)。因此,您应该使用现有的数据(例如主键)进行过滤,而不是使用 id=object.id
。
请注意,您可以使用 redirect(..)
[Django-doc]将 reverse(..)
调用与 HttpResponseRedirect
调用的构造结合起来,因此您可以将其写为:
from django.shortcuts import <b>redirect</b>
def some_view(request, pk):
Category.objects.filter(id=<b>pk</b>).update(
vote_submissions=F('vote_submissions')+1
)
return <b>redirect(</b>'index'<b>)</b>
关于python - 在 Django View 中增加 PositiveIntegerField 最有效的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59406335/