generate update query using django orm

后端 未结 3 703
囚心锁ツ
囚心锁ツ 2021-02-08 18:26

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 = mod         


        
相关标签:
3条回答
  • 2021-02-08 19:15

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

    0 讨论(0)
  • 2021-02-08 19:16

    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)

    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
    

    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 WHERE NOT (`api_event`.`app` = some)
    
    0 讨论(0)
  • 2021-02-08 19:22

    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.

    0 讨论(0)
提交回复
热议问题