Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django查询的强制内部联接_Python_Sql_Django_Orm - Fatal编程技术网

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()
调用之前。

如果有人想知道我做了什么可怕的事情来实现这一点,我最终用字符串替换了“外部”作为“内部”。总的来说,但至少我的查询仍将随着未来模式的调整而扩展。