Tit*_*usz 7 mysql django django-admin
我有一个带有3个ForeignKey字段的简单模型.
class Car(models.Model):
wheel = models.ForeignKey('Wheel', related_name='wheels')
created = models.DateTimeField(auto_now_add=True)
max_speed = models.PositiveSmallIntegerField(null=True)
dealer = models.ForeignKey('Dealer')
category = models.ForeignKey('Category')
Run Code Online (Sandbox Code Playgroud)
对于django管理员中的列表视图,我得到4个查询.其中一个是带有3个INNER JOINS的SELECT.那个查询是慢的方法.用STRAIGHT_JOIN替换INNER JOIN将解决问题.有没有办法在评估之前修补管理生成的查询?
我已经为Django ORM实现了INNER JOIN的修复程序,在与INNER JOINs一起订购时,它将使用STRAIGHT_JOIN。我与Django core-devs进行了交谈,我们决定暂时将其作为单独的后端进行。因此,您可以在这里查看:https : //pypi.python.org/pypi/django-mysql-fix
但是,还有另一种解决方法。使用James的答案中的代码段,但将select_related替换为:
qs = qs.select_related('').prefetch_related('wheel', 'dealer', 'category')
Run Code Online (Sandbox Code Playgroud)
它将取消INNER JOIN并使用4个单独的查询:1个用于提取汽车,另外3个使用car_idIN(...)。
更新: 我发现了另一种解决方法。在您的ForeignKey字段中指定null = True后,Django将使用LEFT OUTER JOINs代替INNER JOIN。在这种情况下,LEFT OUTER JOIN的工作不会出现性能问题,但是您可能会遇到其他我尚不了解的问题。