django:通过一个外键模型的多个键值对来过滤对象

时间:2014-09-04 15:26:27

标签: django

我想知道哪种是过滤对象的最佳方法,它具有一个外部模型的多个参数/值对。 例如:

class Car(models.Model):
    name = models.SlugField("Name")

class Parameter(models.Model):
    name  = models.SlugField()
    value = models.TextField(blank=True)
    car   = models.ForeignKey('Car', related_name = 'parameters')

假设我有一些车具有以下3个特定参数:(名称=颜色,值=蓝色); (name = tire,value = Goodyear); (名称=座位,价值=皮革)

过滤所有具有这些特定参数/值组合的汽车的最佳方法是什么? 我现在所做的是在循环中过滤掉另一个参数/值对。但这需要花费很多时间,而且我确信有更好的方法。不管怎样,聚合可能......?

到目前为止,唯一能让它发挥作用的方法是:

 Job.objects.filter( Q(parameters__name="tire", parameters__value="Goodyear") ).filter( Q(parameters__name="color", parameters__value="blue") ).filter( Q(parameters__name="seat", parameters__value="leather") )

2 个答案:

答案 0 :(得分:2)

如果我理解你正确你想要OR一些查询过滤器,默认情况下Django将所有过滤器放在一起。要引入ORing,您应该使用Q对象。在您的示例中,您需要ANDing(&)和ORing(|)的组合:

from django.db.models import Q

queryset = Car.objects.filter(
    (Q(parameters__name='color') & Q(parameters__value='blue')) | 
    (Q(parameters__name='tire') & Q(parameters__value='Goodyear')) |
    (Q(parameters__name='seat') & Q(parameters__value='leather'))
)

请注意从Car到Parameter的反向查找。

这应该等同于让我所有拥有参数的汽车:名称=颜色和值=蓝色OR参数:名称=轮胎和价值=固特异或参数:名称=座位和价值=皮革。

答案 1 :(得分:1)

使用Q选项。

from django.db.models import Q

query = Q()
query &= (Q(name='color') & Q(value='blue'))
query &= (Q(name='tire') & Q(value="Goodyear"))
query &= (Q(name="seat") & Q(value="leather"))

# List : Force the db call to one call
result = list(Parameters.objects.filter(query))
for c in result:
   c.car

应该有效。