python - 为 Django 查询强制 INNER JOIN

标签 python sql django orm

这是我的架构:

城市 --> 摄影师

我正在尝试获取至少有一名摄影师的城市列表,并返回这些城市的摄影师人数。

这是我正在使用的查询集:

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/

相关文章:

mysql - 左连接问题

sql - 如何使用 OR 条件优化日期范围

python - 显示 html 标签的 django 模板

python - 为什么我可以接收数据但无法正确渲染数据(带有flask-restapi/jinja2的angularjs)

mysql - 如何测试一个 id 列表是否存在于另一个 id 列表中?

python - Django中的联合和相交

python - Django/db-api 无法创建数据库?

python - 创建随机数列表并过滤列表以仅包含大于 50 的数字

python - Python Generator 抽象基类没有实现必要的 __del__,这是故意的吗?

python - pyenv 无法找到 docker-compose