Django - 加入多个表(模型)并根据它们的属性过滤掉

Django - joining multiple tables (models) and filtering out based on their attribute

总的来说,我是 django 和 ORM 的新手,所以在想出连接多个表的查询时遇到了麻烦。

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

Category: 'male'

SubCategory: 'shoes'

Product: 'nikeXYZ'

Packaging: 'size_36: 1'

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

我的问题是 - 如何在给定 Category(例如男性)的情况下过滤 Product,并且只显示 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 次访问 (available, subcategories)。有没有办法一次性搞定?

尝试阅读: this 您可以使用 _set、multi __(通过 FK 查询 link 模型)或创建列表 ids

我认为这应该可行,但未经测试:

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

大概subcategori‌​es__category_id__in=‌​[id_of_male]可以换成.._id=id_of_male

试试这个:

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