Python Django查询的强制内部联接
这是我的模式: 城市摄影师 我正在尝试获取至少有一名摄影师的城市列表,并返回城市的摄影师计数 以下是我正在使用的查询集:Python Django查询的强制内部联接,python,sql,django,orm,Python,Sql,Django,Orm,这是我的模式: 城市摄影师 我正在尝试获取至少有一名摄影师的城市列表,并返回城市的摄影师计数 以下是我正在使用的查询集: City.objects.annotate(photographer_count=aggregates.Count('photographers')).filter(photographer_count__gt=0).order_by('-photographer_count') 这也正是我所期望的,除了出于某种原因,Django选择在城市/摄影师之间使用左外连接。如果我抓
City.objects.annotate(photographer_count=aggregates.Count('photographers')).filter(photographer_count__gt=0).order_by('-photographer_count')
这也正是我所期望的,除了出于某种原因,Django选择在城市/摄影师之间使用左外连接。如果我抓取SQL文本并简单地将“left-outer”更改为“inner”,查询时间从~11秒变为200ms,结果相同
我曾尝试在注释前面放置一个过滤器,以提示Django它应该是内部连接,但这不起作用
我可以对它执行任何Django查询巫术来获得内部连接吗?我意识到我可以使用直接SQL,但我更愿意使用ORM。您通常无法对Django执行的查询和连接进行这种级别的控制 Django并没有做真正聪明的事情,比如注意,过滤条件意味着您可以在这一点上摆脱内部联接——它必须生成在一般情况下正确的查询,在这种情况下,就我所知,这意味着左外部联接
因此,您可能需要原始SQL。默认情况下,会生成一个
左连接
,这样Django甚至可以为没有摄影师的城市获取行。如果你知道你不想要这些,这里有一个技巧可以强迫Django生成一个内部连接
:
City.objects.filter(
photographer__isnull=False
).annotate(
photographer_count=aggregates.Count('photographers')
).filter(
photographer_count__gt=0
).order_by(
'-photographer_count'
)
具体地说,第一个过滤器告诉Django,
内部连接是安全的。它必须出现在annotate()
调用之前。如果有人想知道我做了什么可怕的事情来实现这一点,我最终用字符串替换了“外部”作为“内部”。总的来说,但至少我的查询仍将随着未来模式的调整而扩展。