使用django orm生成更新查询

时间:2013-03-10 07:15:57

标签: python django orm sql-update

我需要使用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 个答案:

答案 0 :(得分:26)

之前的回答者都有解决方案的一部分:您应该将updateF()结合使用:

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

请注意,这样就完成了就地更新,而根本不需要SELECT。

答案 1 :(得分:1)

您可以使用update,详情可在the documentation

中找到

答案 2 :(得分:1)

对于 yourModel.find({ "rubric": { "$exists": true } }) v 2.2(也许 3+)SQL 语句编译函数可以是:

django

其中 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_setMyShinyModel.objects.filter(id=42) 是要更新的模型字段字典

答案 3 :(得分:0)

如果您需要将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)