16
 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'

我发现了类似的问题,但我遇到了重写 queryset() 方法的问题(不能写类似的东西qs.warehouse_set.all().annotate(models.Sum('amount')))。有什么方法可以为我调整这个解决方案,或者在我的情况下,还有另一种解决方案吗?

4

1 回答 1

21

使用链接问题中的代码(和建议的编辑),底部应该为您的示例执行此操作。其原理是使用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'
于 2013-04-10T20:17:14.987 回答