python - 在 Django View 中增加 PositiveIntegerField 最有效的方法是什么?

标签 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'))

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

最佳答案

后者会更快,因为您使用一个查询进行增量。前者将进行两个查询:一个是获取对象,另一个是想要更新该对象。数据库查询是“昂贵的”,因为通常需要大量工作来构建查询、将查询发送到数据库、让数据库解码和评估查询、发回结果并评估结果。这需要大量工作。

重要的是不要首先获取对象,因为否则我们仍然会进行两个查询(因此更改不会那么重要)。因此,您应该使用现有的数据(例如主键)进行过滤,而不是使用 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/

相关文章:

linux - Nose 测试不同 Python 版本的执行?

python - 错误请求 (400) Nginx + Gunicorn + Django + FreeBSD

php - 与多个较小的 SQL 相比,使用连接执行单个 SQL SELECT 是否更有效?

mysql - 外键应该以一对零或一对一的关系存在吗?

python - 如何使用 pandas 将特定列设置为 int 类型

python - Pyspark - 将 datetime.time 函数应用于数据帧的所有行

python - 是 Django 部署中的目录错误

python - 为什么运行 celeryd 时会得到 "SyntaxError: Non-ASCII character '\xa 3'"?

php - 从 TIME 函数中删除秒数?

python - MySQLdb 如何知道它是否是来自 mysql 的字段的未签名