Django Q过滤器在多对多字段中没有返回结果

时间:2016-06-17 19:14:54

标签: django filter

我的理解(根据我在我的代码中观察到的),如果我做了类似的事情:

Distinct_Alert.objects.filter(somefield=somevalue) 

我应该获得与该查询完全匹配的行,而不是

Distinct_Alert.objects.filter(somefield=somevalue, entities__in=somelist)

说我的列表包含3个元素,并且我有可以匹配其中一个元素的行,然后它将返回该行。我想要做的是只在匹配列表中的所有元素时才获取行,这可能吗?

我尝试过以下操作:

Distinct_Alert.objects.filter(Q(alert_type=alert_type) & reduce(operator.and_, [Q(entities=c) for c in entities]))

实体是一个多对多的字段,由于某些原因,即使我可以看到符合此确切条件的行,也总是返回不匹配的内容。 Q不适用于多个领域吗?

根据建议我尝试过链接并且它有效,但是这种方法感觉不对而且不稳定

chained_query = Distinct_Alert.objects.filter(alert_type=alert_type)
for entity in entities:
    chained_query = chained_query.filter(entities=entity[0])

这会返回正确的结果,但不会:

Distinct_Alert.objects.filter(Q(alert_type=alert_type) & reduce(operator.and_, [Q(entities=c[0]) for c in entities]))

此外,链接过滤器是否会遇到搜索子集小于包含行集的潜在问题?

1 个答案:

答案 0 :(得分:0)

尝试使用Q:

from django.contrib.db.models import Q

然后

 Distinct_Alert.objects.filter(somefield=somevalue).exclude(~Q(number__in=somelist))