【发布时间】:2020-12-09 03:39:09
【问题描述】:
我有一个表映射(id, key, value),我想从中选择具有相同值的键。在 SQL 中我可以做
SELECT key FROM map WHERE value IN (SELECT value FROM map GROUP BY value HAVING COUNT(*) > 1);
我试着把它翻译成 Django 的 ORM 风格
from django.db.models import Count
Map.objects.filter(value__in=Map.objects.values('value').annotate(count=Count('value')).filter(count__gt=1)).values('key')
但它失败了,因为__in 过滤器中的子查询返回两列,选定的value 列和计数列:
SELECT "map"."key" FROM "map" WHERE "map"."value" IN (SELECT U0."value", COUNT(U0."value") AS "count" FROM "map" U0 GROUP BY U0."value" HAVING COUNT(U0."value") > 1)
如何从该子查询中删除不需要的 count 列?
【问题讨论】:
-
您是否尝试过使用
Subquery执行此操作? docs.djangoproject.com/en/3.1/ref/models/expressions/… -
@markwalker_ 将子查询限制为单个列是我想要的,但
.values()不会将注释限制为单个列,除非该列是注释本身。此外,__in过滤器中的查询是一个隐式子查询,django 会内联它。