讓我們說我有一個項目模型,該模型與功能的用於M2M關係:Django的:通過路口過濾查詢集導致
class Item(models.Model):
features = models.ManyToManyField(to = 'Feature')
現在我想篩選Item
查詢集只包括其擁有的項目至少所有的指定功能。
讓我們說,可能的特點是:Camera
,Touchscreen
,Keyboard
現在我想選擇所有具有都相機和鍵盤
任何解決方案的項目?
讓我們說我有一個項目模型,該模型與功能的用於M2M關係:Django的:通過路口過濾查詢集導致
class Item(models.Model):
features = models.ManyToManyField(to = 'Feature')
現在我想篩選Item
查詢集只包括其擁有的項目至少所有的指定功能。
讓我們說,可能的特點是:Camera
,Touchscreen
,Keyboard
現在我想選擇所有具有都相機和鍵盤
任何解決方案的項目?
假設要素的模型有一個名爲「名稱」的字段,您可以在值列表中過濾與該字段匹配的項目。像這樣的東西會工作:
Item.objects.filter(features__name__in=['Camera', 'Touchscreen', 'Keyboard'])
UPDATE:
由於stalk說here,拿到賽所有你需要做很多「過濾器」的查詢功能的項目。動態獲取它的方法是:
features = ['Camera', 'Touchscreen', 'Keyboard']
items = Item.objects.all()
for feature in features:
items = items.filter(feature__name=feature)
這樣您就可以傳遞動態功能列表以匹配項目。
如果要素模型使用一個名稱字段,則這應該工作:
Items.objects.filter(features__name='Camera', features__name='Keyboard')
編輯:在上面的查詢 語法錯誤。應將2個過濾器鏈接在一起:
Items.objects.filter(features__name='Camera').filter(features_name='Keyboard')
這是Python的語法,你在重複關鍵字參數。然而,雙重過濾(Item.objects.filter(..)。filter(..))按預期工作。然而,這有點棘手,尋找更乾淨的方式;) – migajek 2013-04-26 16:09:44
此查詢將返回所有項目,其中**至少有一個來自提供列表的**功能。問題是「我想選擇所有具有**照相機和鍵盤**的項目」。所以,查詢必須是'Item.objects.filter(features__name ='Camera')。filter(features__name ='Keyboard')' – stalk 2013-04-26 15:43:17
哇!...顯然我沒有閱讀規則 – Darwin 2013-04-26 16:03:51
好吧,多重過濾是一個選項但是它有點棘手,並且 - 在重新篩選許多功能時,會導致查詢字符串顯着增長。我正在考慮過濾python端.. – migajek 2013-04-26 16:11:39