2017-06-06 45 views
1

我是新来的Django和ORM的一般,所以有麻烦提出查询将加入多个表。Django - 加入多个表(模型),并根据它们的属性过滤掉

我有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)我想。有办法一次完成吗?

+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链接机型)查询或创建列表IDS

0

我认为这应该工作,但它不是测试:

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