2017-04-07 192 views
0

模型有一個FK到系統。我想在系統 admin更改列表中顯示工作站列爲列。我已經用下面的代碼實現了這一點,但是我很難將'num_stations'列排序。Django管理員:SORTING list_display字段反向FK聚合

model.py:

class System(models.Model): 
    pass 

class Station(models.Model): 
    system_info = models.ForeignKey(System) 

admin.py:

class SystemAdmin(admin.ModelAdmin): 
    def num_stations(self, obj): 
     return obj.station_set.count() 

    # num_stations.admin_order_field = ???? 
    num_stations.short_description = 'stations' 

    list_display = (num_stations',) 

成反向關係的普通 'station_set' 的語法似乎並沒有在admin_order_field工作,即使其他堆溢出問題一般顯示正向移動關係支持 例如

+1

的[問題](https://stackoverflow.com/questions/2168475/django-admin-how-to-sort-by-one-of-the- custom-list-display-fields-that-has-no-d)你鏈接到的包含答案。您需要重寫查詢集並註釋計數。使用'admin_order_field'來引用'station_set.count()'是不可能的,即使這樣做,對queryset中的每個項目進行計數的效率也會低於註釋。 – Alasdair

回答

0

感謝Alasdair作爲他們的評論,答案在this question正如指出。這裏是一個適合我的問題的解決方案:

class SystemAdmin(admin.ModelAdmin): 
    def num_stations(self, obj): 
     return obj.num_stations 

    def get_queryset(self, request): 
     # def queryset(self, request): # For Django <1.6 
     qs = super(SystemAdmin, self).get_queryset(request) 
     # qs = super(CustomerAdmin, self).queryset(request) # For Django <1.6 
     qs = qs.annotate(num_stations=Count('station')) 
     return qs 

    num_stations.admin_order_field = 'num_stations' 
    num_stations.short_description = 'stations' 

    list_display = ('num_stations',)