クエリ中で自己参照できる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()しました…。
どなたか文字列にする方法(スライスの仕方)を教えていただけると助かります!
ソースコード見たり色々試しましたがわかりませんでした。