django 管理员对列表视图中的计算字段进行排序

问题描述

我有两个模型,一个(设备)有另一个(存储)的外键。在存储的管理概述中,我希望能够添加一个计数,以计算出每个存储指向的设备数量。使用下面的代码,我能够正确计算指向每个存储的设备数量。但是,当尝试按存储中的数字进行排序时,它会崩溃并显示以下错误

无法将关键字“_get_device_number”解析为字段。选择是: ... #字段列表

如何将我的计算字段添加到允许搜索的列表中?

class Device(models.Model):
...
storage_id = models.ForeignKey(Storage,on_delete=models.PROTECT,blank=True,null=True) #Allowed to be null since a Device may not be in storage.

class Storage(models.Model):
...
    def _get_device_number(self,):
        return Device.objects.filter(storage_id=self.storage_id).count()

class StorageAdmin(admin.ModelAdmin):
...
    list_display = ['__str__','get_device_number',]

    def get_device_number(self,obj):
        return obj._get_device_number()
get_device_number.admin_order_field = '_get_device_number'

解决方法

管理员列表视图无法访问模型方法。但是,注释管理查询集确实有效。

class StorageAdmin(admin.ModelAdmin):

    def get_queryset(self,request):
        queryset = super().get_queryset(request)
        queryset = queryset.annotate(
            _get_device_number=Count('device')
        )

        return queryset

    def get_device_number(self,obj):
        return obj._get_device_number

    get_device_number.admin_order_field = '_get_device_number'