Django管理员:SORTING list_display字段反向FK聚合

问题描述:

模型有一个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://*.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

感谢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',)