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

时间:2012-10-22 07:31:38

标签: django django-admin django-select-related

我有一个大的水平表(30个字段),有很多外键(每个平均最多10个字段)。在Django管理员中显示表时,我使用select相关来优化并避免多次查询。我要找的是确保只检索我的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,由于生成的查询速度较慢,因此它目前是一个showstopper。还有blob和巨大的varchars,它们不用于显示并仍然被查询。

感谢。

1 个答案:

答案 0 :(得分:0)

请记住,在list_display区块中,您始终可以将x3替换为x3_id,以使用您手头已有的FK值,而不进行任何额外查找(沟渠{{ 1}}完全)。

然后,您可以将select_related的自定义函数与here概述的自定义函数相结合,以便将这些原始FK整数替换为指向自己管理页面的超链接?