2013-04-26 55 views
1

讓我們說我有一個項目模型,該模型與功能的用於M2M關係:Django的:通過路口過濾查詢集導致

class Item(models.Model): 
    features = models.ManyToManyField(to = 'Feature') 

現在我想篩選Item查詢集只包括其擁有的項目至少所有的指定功能。

讓我們說,可能的特點是:CameraTouchscreenKeyboard

現在我想選擇所有具有相機和鍵盤

任何解決方案的項目?

回答

2

假設要素的模型有一個名爲「名稱」的字段,您可以在值列表中過濾與該字段匹配的項目。像這樣的東西會工作:

Item.objects.filter(features__name__in=['Camera', 'Touchscreen', 'Keyboard']) 

UPDATE:

由於stalkhere,拿到賽所有你需要做很多「過濾器」的查詢功能的項目。動態獲取它的方法是:

features = ['Camera', 'Touchscreen', 'Keyboard'] 
items = Item.objects.all() 

for feature in features: 
    items = items.filter(feature__name=feature) 

這樣您就可以傳遞動態功能列表以匹配項目。

+2

此查詢將返回所有項目,其中**至少有一個來自提供列表的**功能。問題是「我想選擇所有具有**照相機和鍵盤**的項目」。所以,查詢必須是'Item.objects.filter(features__name ='Camera')。filter(features__name ='Keyboard')' – stalk 2013-04-26 15:43:17

+0

哇!...顯然我沒有閱讀規則 – Darwin 2013-04-26 16:03:51

+0

好吧,多重過濾是一個選項但是它有點棘手,並且 - 在重新篩選許多功能時,會導致查詢字符串顯着增長。我正在考慮過濾python端.. – migajek 2013-04-26 16:11:39

1

如果要素模型使用一個名稱字段,則這應該工作:

            
 
  
             Items.objects.filter(features__name='Camera', features__name='Keyboard')
            
 

編輯:在上面的查詢 語法錯誤。應將2個過濾器鏈接在一起:

Items.objects.filter(features__name='Camera').filter(features_name='Keyboard')
+0

這是Python的語法,你在重複關鍵字參數。然而,雙重過濾(Item.objects.filter(..)。filter(..))按預期工作。然而,這有點棘手,尋找更乾淨的方式;) – migajek 2013-04-26 16:09:44