我使用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'
我有关联的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
并不包含mpoly
和exclude
属性来阻止它显示在表单视图,当显示列表视图时,它仍然从数据库中提取所有字段并将其加载到内存中。因为mpoly
是如此巨大,我有随机错误(段错误,已处理死亡,......),列表显示需要很长时间才能显示一些简单的整数字段......
有没有办法告诉django不要将mpoly
加载到内存中,在它的数据库查询中完全忽略它以便加载速度快?除了exclude
之外,我还没有在文档中找到任何内容来远程实现这一点。我在这里问我以防万一。“
感谢您的协助。
答案 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