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

时间:2016-01-13 18:11:37

标签: python django gis bigdata

我使用django 1.9和django.contrib.gisArea模型有一个巨大的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'

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

# 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)

问题在于即使我使用list_display并不包含mpolyexclude属性来阻止它显示在表单视图,当显示列表视图时,它仍然从数据库中提取所有字段并将其加载到内存中。因为mpoly是如此巨大,我有随机错误(段错误,已处理死亡,......),列表显示需要很长时间才能显示一些简单的整数字段......

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

感谢您的协助。

1 个答案:

答案 0 :(得分:1)

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

class AreaAdmin(gis_admin.OSMGeoAdmin):

    def get_queryset(self, request):
        qs = super(AreaAdmin, self).get_queryest(request)

        # tell Django to not retrieve mpoly field from DB
        qs = qs.defer('mpoly') 
        return qs

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