2016-01-13 79 views
1

我使用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之外,我還沒有發現任何文件可以遠程實現這一點。我在這裏問的情況下,我失去了一些東西。

感謝您的協助。

回答

0

您可以嘗試覆蓋用於生成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

相關問題