django admin在 ListView 中对计算字段进行排序

标签 django sorting listview admin calculated-field

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

Cannot resolve keyword '_get_device_number' into field. Choices are: ... #List of fields

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

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'

最佳答案

管理 ListView 无法访问模型方法。但是,注释管理查询集确实有效。

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'

关于django admin在 ListView 中对计算字段进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66116933/

相关文章:

python - django模型字段检查实例

qt - 在 Qt Quick 中从 ListView 制作自定义 TableView 的规范方法

c - 在 C 中使用 LVM_GETITEM 和 SendMessage 获取 LVITEM 的文本

django - 将实例传递给 Django 表单集

python - 在管理中保存图像并将其显示在 Django 模板中的正确方法

python - Django 不通过/media/显示图像

c# - 排序数据表 C#

c++ - 为什么 std::sort 比较函数必须在参数相等时返回 false?

arrays - 算法:将 2 个数组划分为 "only in A"、 "intersection of A & B"和 "only in B"

android - 搜索后使用 android 搜索 View 小部件搜索未显示正确位置