Django - 加入多个表(模型)并根据它们的属性过滤掉
Django - joining multiple tables (models) and filtering out based on their attribute
总的来说,我是 django 和 ORM 的新手,所以在想出连接多个表的查询时遇到了麻烦。
我有 4 个模型需要加入 - Category
、SubCategory
、Product
和 Packaging
,示例值为:
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,subcategories__category_id__in=[id_of_male])
- 它没有经过测试,但我认为子类别应该是复数(related_name),如果你没有设置
related_name
,那么 subcategory__set
而不是 od subcategories
应该可以。
大概subcategories__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)
总的来说,我是 django 和 ORM 的新手,所以在想出连接多个表的查询时遇到了麻烦。
我有 4 个模型需要加入 - Category
、SubCategory
、Product
和 Packaging
,示例值为:
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,subcategories__category_id__in=[id_of_male])
- 它没有经过测试,但我认为子类别应该是复数(related_name),如果你没有设置
related_name
,那么subcategory__set
而不是 odsubcategories
应该可以。
大概subcategories__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)