2016-06-17 42 views
0

这是我的理解(从我在我的代码观察到的),如果我这样做:Django的Q过滤器返回很多没有结果的许多领域

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])) 

而且,链式过滤器是否会遇到潜在的问题,其中搜索的子集小于包含集合的行?

+3

的[Django的筛选查询集\ _ \ _在\ *每\ *在列表项(HTTP可能重复://计算器.com/questions/8618068/django-filter-queryset-in-for-every-item-in-list) –

+0

嘿@ShangWang我编辑了这个问题来更准确地描述我的情况,我不相信它是重复的。 –

回答

0

尝试使用问:

from django.contrib.db.models import Q 

然后

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

我用Q更新了我的问题,但仍遇到问题:( –

+0

当您知道实体是m2m时,您将它们全部设为alert = Distinct_Alert.objects.get(id = alert_id),然后实体= alert.entities。所有() - 这将返回所有的实体,所以你可以排除列表中的那些 – dmitryro

+0

我不想从列表中排除它们,我试图找到匹配的Distinct_Alert行,我需要警报类型匹配和相关实体匹配 –