クエリ中で自己参照できるDjangoのFオブジェクト(文字列化は難しそう)

DjangoのFオブジェクトは自己参照するためのものです。

例えば

from django.db.models import F
Model.objects.update( var1 = F( 'var1' ) + F( 'var2' ) )

として、あるモデルの各インスタンスの変数var1をそのインスタンスの他の変数var2だけ増やしたりとか。
便利です。
annotateと一緒にも使えるので、

Model.objects.annotate( var3 = 何らかの処理 ).update( F( 'var1' ) + F( 'var3' ) )

annotateで動的にクエリに追加したフィールドを参照することも出来ます。
めちゃ便利!!

文字列として使うには

F( 'var1' ) + F( 'var2' )

のように+演算子が使われていますが、これはFオブジェクト同士の演算がちゃんと定義されてるだけで、普通の文字列と足したりは出来ません。

F( 'var1' ) + '文字列' はエラー

文字列と連結させたいときはConcatとValueを使い

from django.db.models import F, Value
from django.db.models.functions import Concat

Model.objects.update( var1 = Concat( F( 'var2' ),  Value( '文字列' ) ) )

とします。
Concatは2種類以上のExpressionの演算に使うらしいです。
ほかにどんなExpressionがあるのかは知りません。
何かあったら教えてください!

文字列として扱えないので…

文字列として扱えないので、スライスできません。
F( 'var1' )[:-3]とかできません。
Concatしても同様です。
ファイル名にあった.MP4をmp4にしたかったのですが、スライスできなかったので諦めました( ファイル名[:-3] + "mp4" としたかった)。
shellでfor文回すのも面倒そうだったので、for文でインスタンス一つずつファイル名直してsave()しました…。

どなたか文字列にする方法(スライスの仕方)を教えていただけると助かります!
ソースコード見たり色々試しましたがわかりませんでした。

この記事が気に入ったらサポートをしてみませんか?