私はジャンゴ・多型モデルにForeignKeyの関係を持っている平野Djangoのモデルを持っています。 プレーン・モデルをジャンゴ・ポリモフィック・モデルのサブクラスとの関係でフィルタリングしますか?
はのは、サブタイプVideo
と
Audio
(簡単な例)と多形性
Content
モデルに
content
のForeignKeyフィールドを持つ最初の
PlainModel
を呼ぶことにしましょう。
PlainModel
のインスタンスを照会して、Video
を参照したいとします。
問題は、私が見つけ多型モデル自体を経由して直接フィルタリングについてのあるすべてのドキュメントです。したがって、この例ではContent.objects.instance_of(Video)
のようになります。しかし、PlainModel
のものが必要なので、PlainModel.objects.filter(content__instance_of=Video)
のように見える必要があります。私は様々なバリエーションを試しましたが、動作するものは何も見つかりません。
文書ではQ(instance_of=ModelB)
を使用していますが、これはQ(content__instance_of=ModelB)
の関係では機能しません。 '' x "を照会できません:" y "インスタンスでなければなりません。翻訳呼び出しであっても、PlainModelは多相対応ではないため、私は推測します。
PlainModel.objects.filter(content__polymorphic_ctype_id=my_content_type_id)
のような通常のdjangoフィルタを使用してpolymorphic_ctype
フィールドに直接フィルタする一時的なハッキングがありますが、これはサブクラスを処理しません。例:Video
を探しているとき、それは違うのContentType IDを持ってしまうためExtendedVideo
が、見つからないでしょう。
私はこれを解決し、許可されたサブタイプのリストを保持するか、フィルタのコンテンツタイプを増やすために型階層を解析することができますが、それはdjango-polymorphicから機能を複製するようです。
良いアイデアが、私は、これは、これが受け入れられるかどうかを確認するために実行されるSQLを見てする必要があります。 IIRCでは、クエリーセットについて、 '__in'節として何かがありました。 – Bartvds
@Bartvds我々は最初のクエリは、あなたが2番目のクエリのために必要なIDを取得します知っているので、これはDjangoの多形に特有ではありません。ドキュメントのSQLクエリを参照して私の答えを更新しました。 – YPCrumble
確かに、私はJOIN(Django PolymorphicまたはORMを通して直接)を使用するソリューションを期待していました。私たちのような大きなテーブルでは、サブクエリのパフォーマンスはあまり良くありません。しかし、ベンチマークを行い、これがすでに受け入れられているかどうかを確認する必要があると私は考えています。 – Bartvds