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

ach*_*zot 5 python gis django bigdata

我正在使用 django 1.9 和django.contrib.gis一个Area具有巨大 gis 的模型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'
Run Code Online (Sandbox Code Playgroud)

我有关联的AreaAdmin类来管理Areadjango admin 内的 s:

# 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)
Run Code Online (Sandbox Code Playgroud)

问题是即使我正在使用list_display它也不包含mpoly和exclude属性来阻止它在表单视图中显示,但在显示列表视图时,它仍然从数据库中获取所有字段并将其加载到内存中。因为它mpoly太大了,所以我遇到了随机错误(段错误、已处理被杀死……),并且列表显示需要很多分钟才能显示一些简单的整数字段……

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

谢谢您的帮助。

Der*_*wok 6

您可以尝试重写get_queryset用于生成列表视图的方法AreaAdmin。

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
Run Code Online (Sandbox Code Playgroud)

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