我想知道哪种是过滤对象的最佳方法,它具有一个外部模型的多个参数/值对。 例如:
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") )
答案 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
应该有效。