Django admin:如何通过自定义方法对列进行排序

Posted

技术标签:

【中文标题】Django admin:如何通过自定义方法对列进行排序【英文标题】:Django admin: how to sort column by custom method 【发布时间】:2013-04-02 09:04:20 【问题描述】:
 class Item(models.Model):
     name = models.CharField(max_length=100, unique=True)

     def admin_amount(self):
         total = self.warehouse_set.all().aggregate(item=Sum('amount'))
         return total['item']

 class Warehouse(models.Model):
     name = models.CharField(max_length=100, unique=True)
     item = models.ForeignKey('Item', blank=True, null=True)
     amount = models.IntegerField()

创建新字段是错误的,但我不能这样做:

 admin_amount.admin_order_field = 'admin_amount'

我找到了similar question,但我遇到了重写queryset() 方法的问题(不能写qs.warehouse_set.all().annotate(models.Sum('amount')) 之类的东西)。有没有办法为我调整这个解决方案,或者就我而言,还有另一种解决方案?

【问题讨论】:

【参考方案1】:

使用the linked question(和suggested edit)中的代码,底部应该为您的示例执行此操作。原理是使用annotate将子查询中的附加数据添加到返回的QuerySet中。在这种情况下,Sum 是仓库中的金额。

接下来,您添加一个包装函数 amount_in_warehouses 以获取每一行的此值,并告诉管理员在列表中显示此值 list_display = ('amount_in_warehouses',),并对其进行排序 amount_in_warehouses.admin_order_field = 'amount_in_warehouses'

class ItemAdmin(admin.ModelAdmin):
    list_display = ('amount_in_warehouses',)
    name = models.CharField(max_length=100, unique=True)

    def queryset(self, request):
        qs = super(ItemAdmin, self).queryset(request)
        qs = qs.annotate(models.Sum('warehouse__amount'))
        return qs

    def amount_in_warehouses(self, obj):
        return obj.warehouse__amount__sum
    amount_in_warehouses.admin_order_field = 'amount_in_warehouses'

【讨论】:

以上是关于Django admin:如何通过自定义方法对列进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何将额外的参数传递给 django admin 自定义表单?

如何在 Django-admin 中添加自定义搜索框?

如何测试自定义 django-admin 命令

自定义django-admin命令

自定义django-admin命令

Django admin:如何在单击自定义按钮时调用操作?