2013-04-02 34 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'