2015-11-04 60 views
0

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

正如你所看到的,条件与。 有没有更有效的方法来做这个查询?

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

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

我有点意外的是,第一个查询显然是给你的结果;我认为过滤器链,正如你所述,AND-ed,因此第一个过滤器排除第二个过滤器(因为'condition__temperature = 22'不包括'condition_temperature = 30')。这就是你确实(正确的,我认为)采取你的另一种方法。这个问题可能是:你想达到什么,结合两个独占条件? – Evert

+0

参见http://stackoverflow.com/questions/8164675/chaining-multiple-filter-in-django-is-this-a-bug。过滤器链确实是OR-ed在一起,因此为了在第二种方法中获得相同的行为,请用&替换&。如果这确实是你想要的。 – Evert

回答

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

+0

从条件到决策有一个外键,这意味着你可以有2个温度(在不同的位置)。也许我的例子不好,但棘手的部分是这是一对多的关系,所以你所建议的不适合我。不过谢谢。 – max