Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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 string') 

This causes MySQL to throw an exception. Is there anyway to do this without writing raw SQL?

like image 930
Zach Avatar asked Jul 21 '10 15:07

Zach


People also ask

How do you concatenate strings with F in Python?

concatenate with f-strings In Python 3.6 and above, use f-strings(formatted string literals) which makes the format() function easier to use. This can be used by simply adding a f or F before the quotes in the string literal. Expand any variable in f-strings , and call any process in {} .

How do you concatenate objects and strings?

The concat() method appends one or more string values to the calling string and then returns the concatenated result as a new string. Because the concat() method is a method of the String object, it must be invoked through a particular instance of the String class.


1 Answers

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

like image 191
tombishop83 Avatar answered Oct 14 '22 01:10

tombishop83