Django F() オブジェクトを文字列連結に使用できますか? 質問する

Django F() オブジェクトを文字列連結に使用できますか? 質問する

次のような ORM を介して Django アップデートを実行したいと思います。

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

これにより、MySQL は例外をスローします。生の SQL を記述せずにこれを実行する方法はありますか?

ベストアンサー1

私も同様の問題を抱えていました。基本的には、2 つのフィールドを連結してユーザーのフルネームを取得したいと考えていました。私は次のようにして解決しました (ただし、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()))

ここで、F('...')は引数をクエリとして評価するため、モデル自体のフィールドをクエリしたり、filter/get で行うようにモデルをまたいだクエリを実行できます。一方、は引数を文字どおりに評価し(私の場合は、とValue('...')の間にスペースを入れる必要がありました)、注釈を付けられたフィールドの型を指定します(私は にしたかったのです)。詳細については、以下をお読みください。first_namelast_nameoutput_field=...CharFieldConcat に関する Django ドキュメント

おすすめ記事