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



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

    list_display = ('fname', 'midname', 'lname', 'prefix', 'suffix',)

为此,一个简单的选择查询包括上述字段就足够了,但是当有 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_filter = ['department__name']

这样它就是内部加入部门。我现在删除了它,它向我显示了优化的查询

丹戈岩石

相关内容

  • 没有找到相关文章

最新更新