Mysql 为什么Django在变更列表视图页面中进行不必要的SQL查询?

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

我有一个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.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