2013-04-02 36 views
11
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() 

创造新的领域是错误的,但我不能这样做Django管理:如何通过自定义的方法排序列

admin_amount.admin_order_field = 'admin_amount' 

我发现similar question但我遇到一个问题,重写查询集()方法(不能写如qs.warehouse_set.all().annotate(models.Sum('amount')))。有什么办法可以适应我或我的情况,还有另一种解决方案吗?

回答

17

使用the linked question(和suggested edit)中的代码,底部应该为你的例子做。原则是使用注释将附加数据从子查询添加到返回的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'