2014-07-10 31 views
0

我希望能夠通過Django Admin中的多個自定義方法進行排序。 This question僅爲一種方法提供解決方案。如何在Django Admin中使用很多自定義方法進行排序

我試圖修改它:

from django.db import models 

class CustomerAdmin(admin.ModelAdmin): 
    list_display = ('number_of_orders','number_of_somevalue') # added field 

    def queryset(self, request): 
     qs = super(CustomerAdmin, self).queryset(request) 
     qs = qs.annotate(models.Count('order')) 
     qs = qs.annotate(models.Count('somevalue')) # added line 
     return qs 

    def number_of_orders(self, obj): 
     return obj.order__count 
    number_of_orders.admin_order_field = 'order__count' 

    def number_of_somevalue(self, obj): # added method 
     return obj.somevalue__count 
    number_of_somevalue.admin_order_field = 'somevalue__count' 

和它的作品不正確。它似乎將count值乘以而不是單獨計算它們。

實施例:

我有2個數量和2個somevalues,但在面板我看到4個數量和4個somevalues。

用另一個值添加另一個方法使其成爲8(2 * 2 * 2)。

我該如何解決?

回答

0

你可以試試這個被很多自定義方法進行排序(測試):

from django.db.models import Count 

class CustomerAdmin(admin.ModelAdmin): 

    # The list display must contain the functions that calculate values 
    list_display = ('number_of_orders','number_of_somevalue') # added field 

    # Overwrite queryset in model admin 
    def queryset(self, request): 
     qs = super(CustomerAdmin, self).queryset(request) 
     # The query have to return multiple annotation, for this use distinct=True in the Count function 
     qs = qs.annotate(number_orders = Count('order', distinct=True)).annotate(number_somevalue = Count('somevalue',distinct=True)) 
     return qs 

    # This function return the new field calculated in queryset (number_orders) 
    def number_of_orders(self, obj): 
     return obj.number_orders 

    number_of_orders.admin_order_field = 'numberorders' # sortable new column 

    # And this one will return the another field calculated (number_somevalue) 
    def number_of_somevalue(self, obj): # added method 
     return obj.number_somevalue 

    number_of_somevalue.admin_order_field = 'number_somevalue'# sortable new column 
+0

謝謝你的建議@ArtjomB。這是我的第一個答案 – pipesalazar

相關問題