我需要使用 django orm 来实现这个查询:
update table set field=field+1 where id=id
我不想用这个:
o = model.objects.get(id=id)
o.field+=1
o.save()
因为它使用 select 和 when update,而不是线程安全的。
如何通过 orm 实现这一点?
我需要使用 django orm 来实现这个查询:
update table set field=field+1 where id=id
我不想用这个:
o = model.objects.get(id=id)
o.field+=1
o.save()
因为它使用 select 和 when update,而不是线程安全的。
如何通过 orm 实现这一点?
之前的两个回答者都有部分解决方案:您应该update
结合使用F()
:
Model.objects.filter(id=id).update(field=F('field') +1))
请注意,这完全不需要 SELECT 就地更新。
您可以使用update
,详细信息可以在文档中找到
对于django
v 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)
where query_set
isMyShinyModel.objects.filter(id=42)
和update_kwargs
是要更新的模型字段字典
如果您需要将UPDATE ORM
查询转换为语句UPDATE SQL
而不执行它
update() 方法立即应用并返回查询匹配的行数(django 1.8 docs)
def generate_update_sql(queryset, update_kwargs):
""" [checked on django 1.8]
Converts queryset with update_kwargs
like if was: queryset.update(**update_kwargs)
"""
from django.db.models import sql
query = queryset.query.clone(sql.UpdateQuery)
query.add_update_values(update_kwargs)
compiler = query.get_compiler(queryset.db)
sql, params = compiler.as_sql()
return sql % params
用法
qs = Event.objects.exclude(app='some')
update_kwargs = dict(description='test', action='action')
generate_update_sql(qs, update_kwargs)
将返回
UPDATE `api_event` SET `description` = test, `action` = action WHERE NOT (`api_event`.`app` = some)