django - 改进迭代查询

时间:2015-11-04 08:24:47

标签: django

我有一个django应用程序,我在循环中迭代地进行过滤。 这是一个简化的例子:

class Decision(models.Model):
    recommendation = models.TextField()

class Condition(models.Model):
    dec = models.ForeignKey(Decision, related_name='condition')
    temperature = models.PositiveInteger()
    pressure = models.PositiveInteger()

Decision.objects.filter(condition__temperature=22, condition__pressure=123 ).filter(condition__temperature=30, condition__pressure=144).values_list('id',flat=True)

如您所见,条件是AND。 有没有更有效的方法来进行此查询?

这是另一种方法,但它没有给我任何结果:

Decision.objects.filter(Q(condition__temperature=22, condition__pressure=123 ) &\
    Q(condition__temperature=30, condition__pressure=144)).values_list('id',flat=True)

1 个答案:

答案 0 :(得分:0)

您的查询几乎正确,但必须是OR

Decision.objects.filter(
    Q(condition__temperature=22, condition__pressure=123 ) |  # OR
    Q(condition__temperature=30, condition__pressure=144)
).values_list('id',flat=True)

显然,你的病情温度不能同时为22 AND 30。

您可以对条件列表执行相同的操作:

from operator import or_
from django.db.models import Q

predicates = [
    {'condition__temperature': 22, 'condition__pressure': 123}, 
    {'condition__temperature': 30, 'condition__pressure': 144}]
conditions = [Q(x) for x in predicates]
query = Decision.objects.filter(reduce(or_, conditions))

您可以在此处阅读有关Q的完整文档:django-docs