2011-05-17 10 views
3

私はPerson、Food、Flavorという3つのモデルがあるとします。Django - フィルタリング中に多対多オブジェクトを1つのエンティティとして扱う

PersonとFlavorは多対多の関係を共有しています(多くの味が好きかもしれません)。
フードとフレーバーは多対多の関係を共有しています(フードには多くのフレーバーがあります)。

特定の人のために、私はその人の味のサブセットである一連の味を持っているすべての食品を返したいと思います。例えば

personA.flavor.all() - > '辛い '甘い'、 '苦い']
foodA.flavor.all() - > [ '辛いです' '甘い']
foodB.flavor.all() - > [ 'スパイシー、 '苦い']
foodC.flavor.all() - > ['] '「、' 苦い脂っこい

私は、foodAとfoodBを含むQuerySetを返すように、DjangoのフィルタをFood.objectsに使用したいと思います。

ユーザーのフレーバーをセットに変換し、各フードのフレーバーのリストでissupersetを呼び出して(あらかじめ定義されたリストにそのフードを追加しても)同様の結果が得られることは理解していますが、 djangoモデルのフィルタ関数を含むより優雅な解決策があれば、リストの代わりにQuerySetを返してくれるのだろうかと疑問に思います。

ご協力いただきありがとうございます。

+0

http://docs.djangoproject.com/en/dev/topics/db/queries/#spanning-multi-valuated-relationships – vartec

+0

あなたはどのバージョンのDjangoを使用していますか? –

+0

また、何をしようとしていますか?あなたは疑似コードのクエリを与えることができますか?あなたの質問の最初の部分は、あなたがFoodのクエリーセットからフレーバーのクエリーセットを見つけようとしているように聞こえます。第二の部分は、あなたが食べ物の質問集を取得しようとしているように聞こえる。 –

答えて

1

私はあなたがちょうどdjangoのormを使用した後何を達成することができるとは思わない。それは、結果セットが別の結果セットのスーパーセットであるかどうかをチェックすることができたSQLを生成することを何とかして行います。これは、結果セットを回転させることができれば(SQLで)可能です。 SQL Serverにはこれを行うことができるPIVOTとUNPIVOT演算子がありますが(他のDBMSパッケージにはおそらく同様の演算子が含まれている可能性があります)、djangoはそのようなSQLを生成できません。私は、汎用ORMがこれに対応できるかどうか疑問に思う。

あなたがすでに認識している解決策は、すでに十分にエレガントです。必要なすべてのデータを取得するには2つのクエリで十分であり、汎用言語ではより簡単に設定メンバーシップを判断できます。 SQLでこれを行うことは、少し悪夢(私は思う)です。

良い質問ですが。私は、それが私が支払っていない時間があるよりもずっと多くのトラブルになると気づくまで、結果を達成するためにSQLを書き始めました。それは誰かがそれを投稿した場合、純粋なSQLソリューションを見て非常に興味深いだろう。

+0

あなたの答えをありがとうございました。あなたの励ましによって、私は、除外する食品のリストを引っ張って、それから大きな食品の食料雑貨セットに.excludeを適用するために、私が説明した解決策に進むことに決めました。 – jang0

関連する問題