Can I use Django F() objects with string concatenation?

前端 未结 3 772
野趣味
野趣味 2020-12-08 04:05

I want to run a django update through the ORM that looks something like this:

MyModel.objects.filter(**kwargs).update(my_field=F(\'my_other_field\')+\'a stri         


        
3条回答
  •  轻奢々
    轻奢々 (楼主)
    2020-12-08 04:32

    I had a similar issue; basically I wanted to concatenate two fields to the get the full name of a user. I got it solved this way(but must say that I was using Postgres):

    from django.db.models.functions import Concat
    from django.db.models import F, Value, CharField
    
    AnyModel.objects.filter(**kwargs).annotate(full_name=Concat(F('model__user_first_name'), Value(' '), F('model__user_last_name'), output_field=CharField()))
    

    where, F('...') evaluates its argument as a query, so you can query a field of the model itself, or span across models as you would do in filter/get, while Value('...') evaluates its argument literally(in my case I needed a space to be placed in between first_name and last_name), and output_field=... specifies the Type of the annotated field(I wanted to be a CharField). For more info, you can read Django docs about Concat

    Hope it will be helpful for someone out there. Cheers

提交回复
热议问题