2013-04-02 38 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() 

tạo lĩnh vực mới là sai, nhưng tôi không thể làm điều gì đó nhưDjango admin: làm thế nào để sắp xếp cột theo phương pháp tùy chỉnh

admin_amount.admin_order_field = 'admin_amount' 

tôi thấy similar question nhưng tôi gặp phải một vấn đề với việc viết lại queryset() phương pháp (không thể viết một cái gì đó như qs.warehouse_set.all().annotate(models.Sum('amount'))). Có cách nào để thích ứng với giải pháp này cho tôi hay trong trường hợp của tôi, có một giải pháp khác không?

Trả lời

17

Sử dụng mã trong the linked question (và suggested edit), phía dưới nên làm điều đó cho ví dụ của bạn. Nguyên tắc là sử dụng chú thích để thêm dữ liệu bổ sung từ một truy vấn con vào QuerySet được trả về. Trong trường hợp này là Sum số tiền trong kho.

Tiếp theo bạn thêm hàm bao bọc amount_in_warehouses để nhận giá trị này cho mỗi hàng và yêu cầu quản trị viên hiển thị giá trị này cho danh sách list_display = ('amount_in_warehouses',) và sắp xếp trên 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' 
Các vấn đề liên quan