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工作,即使其他堆溢出问题一般显示正向移动关系支持 例如
答
感谢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',)
的[问题](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