如何忽略在django admin list_display中加载巨大的字段?
问题描述:
我使用Django 1.9和django.contrib.gis
与拥有庞大的GIS MultiPolygonField
的Area
型号:如何忽略在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
不包含mpoly
和exclude
属性以防止它在窗体视图中显示,但在显示列表视图时,它仍然会获取所有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
欲了解更多信息,请参见defer
https://docs.djangoproject.com/es/1.9/ref/models/querysets/#defer
惊人!确切地说,我需要通过搜索找不到。谢谢 ! – achedeuzot