Django 管理员更改列表优化查询:选择 field1,field2 而不是 select *

Posted

技术标签:

【中文标题】Django 管理员更改列表优化查询:选择 field1,field2 而不是 select *【英文标题】:Django admin change-list optimizing query: select field1, field2 instead of select * 【发布时间】:2012-10-11 23:46:45 【问题描述】:

我有一个带有很多外键(每个平均最多 10 个字段)的大型水平表(30 个字段)。在 Django admin 中显示表格时,我使用 select related 来优化和避免多次查询。我正在寻找的是确保只检索我的 list_display 条目,而不是所有 30 个字段 +(外键 X 10)字段。目前,表上的 select * + 所有连接字段上的 select * 都运行。基本上,一种在 Django 管理员级别获取“值”的方法。谢谢。

编辑: 下面是一个例子:

class X(models.Model):
    x1 = models.IntegerField  # needed for admin display
    x2 = models.TextField     # needed for admin display
    x3 = models.ForeignKey(Y) 
    x4 = models.ForeignKey(Z)
    ...                       # X5 to x30 are not needed for admin display
    X30 = models.Integerfield

    @property
    def y1(self) :
        return self.x3.y1

    @property
    def y2(self):
        return self.x4.z1

class Y(models.Model):
    y1 = models.IntegerField  # needed for admin display
    ...
    y10 = models.IntegerField


class Z(models.Model):
    z1 = models.IntegerField  # needed for admin display
    ...                       # z2 to z10 are not needed for admin display
    z10 = models.IntegerField


**admin.py**
list_display = ['x1', 'x2', 'y1', 'z1']

我的问题是,当我查看生成的查询以显示它时,它在 X(x1 到 x30) 上执行选择 *,并使用 select_related,它提取 y1 到 y10 和 z1 到 z10,即使我不需要所有领域。

此表被大量用作 CRM,由于生成的查询速度较慢,因此目前它是一个大热门。还有blob和巨大的varchars,它们不用于显示,仍在查询中。

谢谢。

【问题讨论】:

您在寻找:***.com/questions/291945/… 或 ***.com/questions/1824267/… 这更多的是在查询处理级别。 【参考方案1】:

请记住,在您的 list_display 块中,您始终可以将 x3 替换为 x3_id 以使用您现有的 FK 值,并且根本不需要进行任何额外的查找(完全放弃 select_related)。

然后,您可以将其与 list_display 的自定义函数(如 here 所述)相结合,以将这些原始 FK 整数替换为指向它们自己的管理页面的超链接?

【讨论】:

以上是关于Django 管理员更改列表优化查询:选择 field1,field2 而不是 select *的主要内容,如果未能解决你的问题,请参考以下文章

使用大型列表优化 Django 查询集调用?

扩展 Django 管理模板 - 更改更改列表

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

优化 Django 查询

根据另一个字段中的选择显示/隐藏 django 管理表单字段

如果字段的选择列表发生更改,则停止 Django 创建迁移