如何忽略在 django admin list_display 中加载巨大的字段?

Posted

技术标签:

【中文标题】如何忽略在 django admin list_display 中加载巨大的字段?【英文标题】:How to ignore loading huge fields in django admin list_display? 【发布时间】:2016-01-13 18:11:36 【问题描述】:

我正在使用 django 1.9 和 django.contrib.gis 以及具有巨大 gis 的 Area 模型 MultiPolygonField

# models.py
from django.contrib.gis.db import models as gis_models

class Area(gis_models.Model):

    area_color = gis_models.IntegerField()
    mpoly = gis_models.MultiPolygonField(srid=4326)

    class Meta:
        verbose_name = 'Area'
        verbose_name_plural = 'Areas'

我有关联的 AreaAdmin 类来管理 django admin 中的 Areas:

# admin.py
from django.contrib.gis import admin as gis_admin

class AreaAdmin(gis_admin.OSMGeoAdmin):
    map_width = 800
    map_height = 600
    modifiable = False
    list_display = ['area_color', ]
    exclude = ['mpoly', ]
gis_admin.site.register(Area, AreaAdmin)

问题是,即使我使用不包含mpolyexclude 属性的list_display 来防止它在表单视图中显示,但在显示列表视图时,它仍然会获取所有数据库中的字段并将其加载到内存中。因为mpoly 太大了,所以我遇到了随机错误(段错误、已处理的已终止...),并且列表显示需要很长时间才能显示一些简单的整数字段...

有没有办法告诉django不要将mpoly加载到内存中,在它的数据库查询中完全忽略它,这样它会加载得很快?除了exclude 之外,我在文档中没有找到任何可以远程实现此目的的内容。我在这里问,以防我遗漏了什么。

感谢您的帮助。

【问题讨论】:

【参考方案1】:

您可以尝试覆盖用于为AreaAdmin 生成列表视图的get_queryset 方法。

class AreaAdmin(gis_admin.OSMGeoAdmin):

    def get_queryset(self, request):
        qs = super(AreaAdmin, self).get_queryset(request)
        
        # tell Django to not retrieve mpoly field from DB
        qs = qs.defer('mpoly') 
        return qs

有关defer 的更多信息,请参阅https://docs.djangoproject.com/en/stable/ref/models/querysets/#defer

【讨论】:

以上是关于如何忽略在 django admin list_display 中加载巨大的字段?的主要内容,如果未能解决你的问题,请参考以下文章

Django Admin Cookbook-8如何在Django admin中优化查询

Django Admin Cookbook-23如何在Django admin中添加嵌套的内联

如何将 django-admin-bootstrapped 与 django 1.10 集成

如何忽略“firebase-admin 似乎已安装在不受支持的环境中。”?

如何在 django admin 中进行分类?

Django Admin Cookbook-14如何在Django Admin后台移除“删除所选”操作