如何忽略在 django admin list_display 中加载巨大的字段?
How to ignore loading huge fields in django admin list_display?
我正在使用 django 1.9 和 django.contrib.gis
以及具有巨大 gis MultiPolygonField
:
的 Area
模型
# 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
class 来管理 django admin 中的 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
属性以防止它显示在表单视图中,但在显示列表视图,它仍然从数据库中获取所有字段并将其加载到内存中。因为 mpoly
太大了,我遇到了随机错误(段错误、已处理被杀死……)并且列表显示需要很多分钟才能显示一些简单的整数字段……
有什么方法可以告诉 django 不要将 mpoly
加载到内存中,而是在它的数据库查询中完全忽略它以便加载速度更快?除了 exclude
之外,我没有在文档中找到任何可以远程实现此目的的内容。我在这里问,以防我遗漏了什么。
感谢您的帮助。
您可以尝试重写 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
有关 defer
的更多信息,请参阅 https://docs.djangoproject.com/en/stable/ref/models/querysets/#defer
我正在使用 django 1.9 和 django.contrib.gis
以及具有巨大 gis MultiPolygonField
:
Area
模型
# 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
class 来管理 django admin 中的 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
属性以防止它显示在表单视图中,但在显示列表视图,它仍然从数据库中获取所有字段并将其加载到内存中。因为 mpoly
太大了,我遇到了随机错误(段错误、已处理被杀死……)并且列表显示需要很多分钟才能显示一些简单的整数字段……
有什么方法可以告诉 django 不要将 mpoly
加载到内存中,而是在它的数据库查询中完全忽略它以便加载速度更快?除了 exclude
之外,我没有在文档中找到任何可以远程实现此目的的内容。我在这里问,以防我遗漏了什么。
感谢您的帮助。
您可以尝试重写 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
有关 defer
的更多信息,请参阅 https://docs.djangoproject.com/en/stable/ref/models/querysets/#defer