我有一个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)
答案 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