这与带有MySQL后端的Django 1.4.6有关。当使用 join 进行有序查询时,Django 会将排序子句放在查询的末尾。想象一下一些模型,例如
class MainObject(models.Model):
pass
class RelatedObject(models.Model):
main_object = models.ForeignKey(MainObject)
如果您有很多这样的查询并尝试查询,例如 RelatedObject.objects.select_related('main_object').order_by('-id') limit 20000
它,取决于有多少连接,几乎是没有排序的相同查询的两倍:RelatedObject.objects.select_related('main_object') limit 20000
这是因为生成的查询是
SELECT app_relatedobject.id, app_relatedobject.main_object_id, app_mainobject.id
FROM app_relatedobject
INNER JOIN app_mainobject ON (app_relatedobject.main_object_id = app_mainobject.id)
ORDER BY app_relatedobject.id DESC
LIMIT 20000
这比同等的要慢得多
SELECT tmp.id, tmp.main_object_id, app_mainobject.id
FROM (
SELECT app_relatedobject.id, app_relatedobject.main_object_id
FROM app_relatedobject
ORDER BY app_relatedobject.id DESC
LIMIT 20000) tmp
INNER JOIN app_mainobject ON (app_relatedobject.main_object_id = tmp.id)
有没有办法以有效的方式完成我想要实现的目标?对于上下文,我正在使用 django 管理系统,并且有一个需要跨数千条大记录进行大量联接的list_display。我不能使用原始 sql,因为管理系统的其余部分需要一个查询集进行分页和过滤。
任何帮助将不胜感激。
您可以直接使用 SQL 查询。Django 允许开箱即用的原始 SQL 查询,它确实返回了一个 QuerySet(特别是 RawQuerySet),据我所知,它的行为就像一个普通的 QuerySet。