使用Django ORM生成更新查询

11 投票
4 回答
26064 浏览
提问于 2025-04-17 18:34

我需要用 Django 的 ORM 来实现这个查询:

update table set field=field+1 where id=id

我不想使用这个:

o = model.objects.get(id=id)
o.field+=1
o.save()

因为它会使用选择(select),在更新时不安全,也就是说在多线程环境下可能会出问题。

那么,怎么通过 ORM 来实现呢?

4 个回答

1

对于 django 版本 2.2(可能也适用于 3 及以上版本),SQL 语句的编译功能可以这样写:

from django.db.models.sql.subqueries import UpdateQuery

def compile_update_query(query_set, update_kwargs):
    query = query_set.query.chain(UpdateQuery)
    query.add_update_values(update_kwargs)
    return str(query)

这里的 query_set 是指 MyShinyModel.objects.filter(id=42),而 update_kwargs 是一个包含要更新的模型字段的字典。

2

你可以使用 update,具体的细节可以在 这个文档中找到。

37

之前的回答者们都提到了一部分解决办法:你应该把 updateF() 一起使用:

Model.objects.filter(id=id).update(field=F('field') +1))

注意,这样做可以直接更新数据,而不需要先进行选择操作。

撰写回答