Skip to content Skip to sidebar Skip to footer

Generate Update Query Using Django Orm

I need to implement this query using django orm: update table set field=field+1 where id=id I don't whant to use this: o = model.objects.get(id=id) o.field+=1 o.save() because it

Solution 1:

Both the previous answerers have part of the solution: you should use update in conjunction with F():

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

Note this does an in-place UPDATE without any need for SELECT at all.

Solution 2:

You can use update, details can be found in the documentation

Solution 3:

for django v 2.2 (and maybe 3+) SQL statement compilation function could be:

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

defcompile_update_query(query_set, update_kwargs):
    query = query_set.query.chain(UpdateQuery)
    query.add_update_values(update_kwargs)
    returnstr(query)

where query_set is MyShinyModel.objects.filter(id=42) and update_kwargs is a dictionary of model fields to update

Solution 4:

If you need to convert the UPDATE ORM query to UPDATE SQL statement without performing it

The update() method is applied instantly and returns the number of rows matched by the query (django 1.8 docs)

defgenerate_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

Usage

qs = Event.objects.exclude(app='some')
update_kwargs = dict(description='test', action='action')
generate_update_sql(qs, update_kwargs) 

Will return

UPDATE `api_event` SET `description` = test, `action` = action WHERENOT (`api_event`.`app` =some)

Post a Comment for "Generate Update Query Using Django Orm"