这是我的架构:
城市 --> 摄影师
我正在尝试获取至少有一名摄影师的城市列表,并返回这些城市的摄影师人数。
这是我正在使用的查询集:
City.objects.annotate(photographer_count=aggregates.Count('photographers')).filter(photographer_count__gt=0).order_by('-photographer_count')
这也完全符合我的预期,除了出于某种原因,Django 选择使用左外连接在 city/photographer 之间进行连接。如果我获取 SQL 文本并简单地将“左外”更改为“内”,则查询从大约 11 秒变为 200 毫秒,结果相同。
我试过在注释前面放一个过滤器来提示 Django 它应该是内部连接,但这没有用。
我可以对此执行任何 Django 查询巫术以获得内部连接吗?我意识到我可以直接使用 SQL,但更愿意通过 ORM。
最佳答案
默认情况下,会生成一个 LEFT JOIN
,这样 Django 就可以为您提供行,即使是在摄影师为零的城市。如果您知道您不想要这些,这里有一个技巧可以强制 Django 生成一个 INNER JOIN
:
City.objects.filter(
photographer__isnull=False
).annotate(
photographer_count=aggregates.Count('photographers')
).filter(
photographer_count__gt=0
).order_by(
'-photographer_count'
)
具体来说,第一个过滤器告诉 Django INNER JOIN
是安全的。它必须在 annotate()
调用之前出现。
关于python - 为 Django 查询强制 INNER JOIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11619693/