Mysql 为什么Django在变更列表视图页面中进行不必要的SQL查询?
我有一个Django模特说Mysql 为什么Django在变更列表视图页面中进行不必要的SQL查询?,mysql,django,python-2.7,django-admin,Mysql,Django,Python 2.7,Django Admin,我有一个Django模特说 class Student(models.Model): prefix = models.CharField(max_length = 10, blank = True, null = True,) suffix = models.CharField(max_length = 10, blank = True, null = True,) fullname = models.CharFie
class Student(models.Model):
prefix = models.CharField(max_length = 10, blank = True, null = True,)
suffix = models.CharField(max_length = 10, blank = True, null = True,)
fullname = models.CharField(max_length = 100, null = False,)
fname = models.CharField(max_length = 100, verbose_name = u'First Name', blank = True, null = True,)
midname = models.CharField(max_length = 100, verbose_name = u'Middle Name', blank = True, null = True,)
lname = models.CharField(max_length = 50, verbose_name = u'Last Name', default = ' ')
department = models.ForeignKey('Department')
列表内显示(admin.py)
为此,包含上述字段的简单select查询就足够了,但是当存在FK时,Django使用内部联接以复杂的方式进行SQL查询。比如说,
通常django必须实现
SELECT 'fname', 'midname', 'lname', 'prefix', 'suffix' FROM student LIMIT 0,100;
但是Django对所有可能的字段执行SELECT查询
SELECT student.prefix.student.suffix .... deparment.id ,depatment.name .....
INNER JOIN department ON deparment.id = student.id ........ LIMIT 100
有人能合理解释为什么需要不必要的查询吗 Django无法预见开发人员将选择哪些领域。因此,它将所有字段发送给管理模板,包括所有相关表中的字段。如果需要,开发人员可以覆盖管理模板。 queryset()将提供发送自定义sql语句的功能 希望这个问题能得到回答。哦,我的错! 我使用的是list\u filter=['department\u name'] 因此,它是内部连接的部门。我现在删除了它,它向我显示了优化的查询
DJANGO岩石因为简单和普遍,我想?您可以通过手动重写
ModelAdmin.queryset
或通过一些包装代码轻松实现它,但我觉得Django并不是一种有效的方法
SELECT student.prefix.student.suffix .... deparment.id ,depatment.name .....
INNER JOIN department ON deparment.id = student.id ........ LIMIT 100