2016-10-12 10 views
2

私はジャンゴ・多型モデルにForeignKeyの関係を持っている平野Djangoのモデルを持っています。 プレーン・モデルをジャンゴ・ポリモフィック・モデルのサブクラスとの関係でフィルタリングしますか?

はのは、サブタイプ VideoAudio(簡単な例)と多形性 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から機能を複製するようです。

答えて

0

最初Videoサブタイプを持つすべてのPlainModelのインスタンスを取得し、そのクエリセットである外部キー関係を照会することによってこれを行うことができます。

content_videos = Content.objects.instance_of(Video) 
plain_model_videos = PlainModel.objects.filter(content__in=content_videos) 

参照用the docsを参照してください。

+0

良いアイデアが、私は、これは、これが受け入れられるかどうかを確認するために実行されるSQLを見てする必要があります。 IIRCでは、クエリーセットについて、 '__in'節として何かがありました。 – Bartvds

+0

@Bartvds我々は最初のクエリは、あなたが2番目のクエリのために必要なIDを取得します知っているので、これはDjangoの多形に特有ではありません。ドキュメントのSQLクエリを参照して私の答えを更新しました。 – YPCrumble

+0

確かに、私はJOIN(Django PolymorphicまたはORMを通して直接)を使用するソリューションを期待していました。私たちのような大きなテーブルでは、サブクエリのパフォーマンスはあまり良くありません。しかし、ベンチマークを行い、これがすでに受け入れられているかどうかを確認する必要があると私は考えています。 – Bartvds