【问题标题】:Django Q filter returning no results on many to many fieldDjango Q过滤器在多对多字段上没有返回结果
【发布时间】: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]))

另外,链式过滤器不会遇到搜索子集小于行包含集的潜在问题吗?

【问题讨论】:

标签: django filter


【解决方案1】:

尝试使用 Q:

from django.contrib.db.models import Q

然后

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

【讨论】:

  • 我已经用 Q 更新了我的问题,但仍然遇到问题 :(
  • 当您知道实体是 m2m 时,您会得到所有实体作为 alert = Distinct_Alert.objects.get(id=alert_id) ,然后是 entity = alert.entities.all() - 这将返回所有实体,因此您可以排除列表中的那些
  • 我不是想从列表中排除它们,我想找到与之匹配的 Distinct_Alert 行,我需要匹配的警报类型和匹配的关联实体
  • 如果您知道要包含的实体列表,只需执行 Distingct_Alert.objects.filter(entities__in=entities_to_check_list).filter(somefield=somevalue)
  • entities__in 不是 AND 关系,即使只匹配列表中的一个元素也会命中
猜你喜欢
  • 2020-03-20
  • 2014-08-13
  • 2018-05-25
  • 1970-01-01
  • 2018-06-07
  • 2015-07-18
  • 1970-01-01
  • 2011-07-18
  • 2020-02-12
相关资源
最近更新 更多