Django - 连接多个表(模型)并根据其属性过滤掉

时间:2017-06-06 07:37:28

标签: django django-orm

我一般都是django和ORM的新手,因此无法提出可以连接多个表的查询。

我有4个需要加入的模型 - CategorySubCategoryProductPackaging,示例值为:

Category: 'male'

SubCategory: 'shoes'

Product: 'nikeXYZ'

Packaging: 'size_36: 1'

每个模型对上面的模型都有FK(即。SubCategory有字段category等)。

我的问题是 - 我如何过滤Product给定Category(例如男性)并仅显示Packaging属性available设置为True的产品}?显然,我希望最小化我的数据库上的命中(理想情况下使用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)

但是我认为至少需要2次点击数据库(availablesubcategories)。有没有办法一次性完成?

3 个答案:

答案 0 :(得分:1)

试试这个:

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

答案 1 :(得分:0)

尝试阅读: this 您可以使用_set,multi __(通过FK链接模型)或创建列表ID

进行查询

答案 2 :(得分:0)

我认为这应该有效,但未经过测试:

Product.objects.filter(packaging__available=True,subcategori‌​es__category_id__in=‌​[id_of_male]) 
  • 它没有经过测试,但我认为子类别应该是复数(related_name),如果你没有设置related_name,那么subcategory__set而不是subcategories应该工作

可能subcategori‌​es__category_id__in=‌​[id_of_male]可以切换为.._id=id_of_male