【发布时间】:2016-06-18 04:38:36
【问题描述】:
我的理解是(根据我在代码中观察到的),如果我执行以下操作:
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]))
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]))
另外,链式过滤器不会遇到搜索子集小于行包含集的潜在问题吗?
【问题讨论】:
-
嘿@ShangWang 我已经编辑了这个问题以更准确地描述我的情况,我不相信它是重复的。