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

utworzyć nowe pole jest źle, ale nie mogę zrobić coś takiegoDjango admin: Jak posortować kolumnę metodą niestandardową

admin_amount.admin_order_field = 'admin_amount' 

znalazłem similar question ale wystąpił problem z przepisywania metodę queryset() (nie mogę napisać coś takiego jak qs.warehouse_set.all().annotate(models.Sum('amount'))). Czy istnieje jakiś sposób, aby zaadaptować to rozwiązanie dla mnie lub w moim przypadku istnieje inne rozwiązanie?

Odpowiedz

17

Używając kodu w the linked question (i suggested edit), na dole powinien zrobić to dla twojego przykładu. Zasada polega na użyciu adnotacji w celu dodania dodatkowych danych z pod-zapytania do zwróconego zestawu kwerend. W tym przypadku Sum ilości w magazynach.

Następnie dodajemy funkcję owijki amount_in_warehouses, aby uzyskać tę wartość dla każdego wiersza i powiedzmy administratorowi, aby pokazał to dla listy list_display = ('amount_in_warehouses',) i posortuj na niej 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'