Django 管理员 : how to sort column by custom method

标签 django django-admin

 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')) 的东西)。有什么办法可以为我调整这个解决方案,或者在我的情况下,还有另一种解决方案吗?

最佳答案

使用 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 管理员 : how to sort column by custom method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15760082/

相关文章:

python - 用于代理实时站点的本地开发的 Django 存储后端?

python - 使用 value() 时过滤 Django 查询集的相关 ManyToMany 字段

python - Django:尝试使用来自 GitHub 的 django-audiofield 时导入错误

Django - 基于父实例的内联字段值

django - 如何重建我的 django-mptt 树?

python - Django REST 在查看列表时指定哪些字段

python - Django admin 中的默认过滤器

python - 在 Django 的管理员上记录事件 - Django

python - django-admin.py 不工作

django - 为 Django 静态文件提供服务时的 Apache 403