2017-06-06 9 views
1

私はdjangoとORMを初めて使用しているので、複数のテーブルを結合するクエリに問題が生じます。Django - 複数のテーブル(モデル)を結合し、それらの属性に基づいてフィルタリングを外します。

I 4つの接合必要モデル有する - CategorySubCategoryProductPackagingを、例の値は次のようになります

Category: 'male'

SubCategory: 'shoes'

Product: 'nikeXYZ'

Packaging: 'size_36: 1'

それぞれのモデルは上記のモデルに対してFKを持っています(つまり、 SubCategoryにはフィールドcategoryなどがあります)。

私の質問は - どのように私はTrueからPackaging属性availableセットを持ってCategory(例えばオス)とのみを表示する製品与えProductをフィルタリングすることができますか?明らかに私のデータベースのヒットを最小限に抑えたい(理想的には1つのSQLクエリで行う)。

available = Product.objects.filter(packaging__available=True) 
subcategories = SubCategory.objects.filter(category_id=<id_of_male>) 
products = available.filter(subcategory_id__in=subcategories) 

を私は考える(availablesubcategories)少なくとも、そのデータベースに2安打を必要とします。

は、私はこれらの線に沿って何かを行うことができます。一度にそれを行う方法はありますか?読んで

+0

何、このようなものについて: Product.objects.filter(真= packaging__availableは、subcategories__category_id__in = [id_of_male]) - それはテストされていませんが、私は、サブカテゴリがあるべきだと思います複数(related_name)。 –

答えて

1

これを試してみてください。

lookup = {'packaging_available': True, 'subcategory__category_id__in': ['ids of males']} 
product_objs = Product.objects.filter(**lookup) 
0

試してみてください。 this あなたは、私は、これは動作するはずだと思うけど、それがテストされていない_set、マルチ__(FKでモデルをリンクするため)に照会したり、リストIDに

0

を作成することができます。

Product.objects.filter(packaging__available=True,subcategori‌​es__category_id__in=‌​[id_of_male]) 
あなたが related_nameを設定しなかった場合
  • 、それはテストされていませんが、私は、サブカテゴリが複数(related_name)であるべきだと思う、そしてsubcategory__setではなくsubcategoriesが動作するはずOD。

おそらくsubcategori‌​es__category_id__in=‌​[id_of_male].._id=id_of_maleに切り替えることができます。

関連する問題