Django: Using an F expression for a text field in an update call

后端 未结 5 995
小鲜肉
小鲜肉 2021-01-01 10:17

In a django view, I need to append string data to the end of an existing text column in my database. So, for example, say I have a table named \"ATable\", and it has a fiel

5条回答
  •  抹茶落季
    2021-01-01 11:12

    You can use the Concat db function.

    from django.db.models import Value
    from django.db.models.functions import Concat
    
    ATable.objects.filter(id=100).update(some_field=Concat('some_field', Value('more string')))
    

    In my case, I am adding a suffix for facebook avatars URIs like this:

    FACEBOOK_URI = 'graph.facebook.com'
    FACEBOOK_LARGE = '?type=large'
    # ...
    users = User.objects.filter(Q(avatar_uri__icontains=FACEBOOK_URI) & ~Q(avatar_uri__icontains=FACEBOOK_LARGE))
    users.update(avatar_uri=Concat('avatar_uri', Value(FACEBOOK_LARGE)))
    

    and I get SQL like this (Django 1.9):

    UPDATE `user_user` SET `avatar_uri` = CONCAT(COALESCE(`user_user`.`avatar_uri`, ''), COALESCE('?type=large', ''))
    WHERE (`user_user`.`avatar_uri` LIKE '%graph.facebook.com%' AND NOT (`user_user`.`avatar_uri` LIKE '%?type=large%' AND `user_user`.`avatar_uri` IS NOT NULL))
    

    The result is all image URIs were changed from http://graph.facebook.com//picture to http://graph.facebook.com//picture?type=large

提交回复
热议问题