2011-10-25 136 views
0

我的簡化模型如下:與多於一個的條件的Django多對多濾波器

class Function(models.Model): 
    name = models.CharField(max_length=20) 
    params = models.ManyToManyField("Param") 

class Param(models.Model): 
    name = models.CharField(max_length=20) 
    value = models.CharField(max_length=20) 

所以,每一個功能對象具有一組參數,例如:

f = Function(name="my_function") 
f.save() 
param1 = Param(name="height", value="100") 
param1.save() 
param2 = Param(name="width", value="200") 
param2.save() 
f.params.add(param1) 
f.params.add(param2) 

的問題是我無法確定如何使用函數名稱,參數名稱和參數值上的過濾器來選擇函數。

對於上述功能,選擇應該是:用含有與名稱爲「高度」和值「100」和參數名稱爲「寬度」和值「200」參數名「創建my_function」

Get函數。

預先感謝您!

回答

2

這可能會實現:

from django.db.models import Q 

functions = (Function.objects 
    .filter(name='my_function') 
    .filter(Q(params__name='height') & Q(params__value="100") 
    .filter(Q(params__name="width") & Q(params__value="200")) 
+0

它的工作原理! Q(params__name ='width')&Q(params__value =「200」),但它沒有工作。將Q對象分成兩個過濾器可以。謝謝! – edkirin

+0

沒問題! :) –