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

问题描述:

我使用Django 1.9和django.contrib.gis与拥有庞大的GIS MultiPolygonFieldArea型号:如何忽略在django admin list_display中加载巨大的字段?

# 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管理里面的Area 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) 

问题是,即使我使用的list_display不包含mpolyexclude属性以防止它在窗体视图中显示,但在显示列表视图时,它仍然会获取所有t他从数据库中取出并将其加载到内存中。因为mpoly是如此巨大,我有随机误差(段错误,处理遇难,...)和列表显示需要许多时间才能显示一些简单的整型字段...

有什么办法来告诉Django不要将mpoly加载到内存中,要在它的数据库查询中完全忽略它,以便加载速度更快?除了exclude之外,我还没有发现任何文件可以远程实现这一点。我在这里问的情况下,我失去了一些东西。

感谢您的协助。

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

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 

欲了解更多信息,请参见deferhttps://docs.djangoproject.com/es/1.9/ref/models/querysets/#defer

+0

惊人!确切地说,我需要通过搜索找不到。谢谢 ! – achedeuzot