我的理解(根据我在我的代码中观察到的),如果我做了类似的事情:
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]))
此外,链接过滤器是否会遇到搜索子集小于包含行集的潜在问题?
答案 0 :(得分:0)
尝试使用Q:
from django.contrib.db.models import Q
然后
Distinct_Alert.objects.filter(somefield=somevalue).exclude(~Q(number__in=somelist))