使用Django ORM生成更新查询
我需要用 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
之前的回答者们都提到了一部分解决办法:你应该把 update
和 F()
一起使用:
Model.objects.filter(id=id).update(field=F('field') +1))
注意,这样做可以直接更新数据,而不需要先进行选择操作。