2012-11-24 234 views
1

我怎麼能排序/順序readonly_fields(見https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.readonly_fields)?Django管理:整理/訂貨動態readonly_fields

這裏是我做的:

class MyUserAdmin(UserAdmin): 
    readonly_fields = ('pinCount') 
    list_display = ('username', 'email', 'first_name', 'last_name', 'is_staff', 'is_active', 'date_joined', 'last_login', 'pinCount') 

    def pinCount(self, instance): 
     return Pin.objects.filter(user=instance).count() 

admin.site.unregister(User) 
admin.site.register(User, MyUserAdmin) 

在管理應該是可能的排序PINCOUNT列表。由於它不是一個直接的數據庫字段,根據文檔,這是不可能的。有什麼辦法可以做到嗎?

謝謝!

回答

0

的順序是由DB進行,而不是由管理員(這是一個變化列表上調試工具欄輸出):

enter image description here

這就是爲什麼你不能使用自定義管理方法訂購。你可以通過覆蓋ModeAdmin.queryset method一個Count註釋添加到管理員的查詢集:

class MyModelAdmin(admin.ModelAdmin): 

    ... 

    def queryset(self, request): 
     qs = super(MyModelAdmin, self).queryset(request) 
     return qs \ 
      .annotate(pin_count=Count('pin')) \ 
      .order_by('-pin_count') 

,或者如果你需要更多的控制,你可以嘗試sort the queryset displayed by the admin,但我沒有測試過這一點:

class MyModel(models.Model): 
    ... 

    @property 
    def pin_count(self): 
     return self.pin.count() 


import operator 
class MyModelAdmin(admin.ModelAdmin): 

    ... 

    def queryset(self, request): 
     qs = super(MyModelAdmin, self).queryset(request) 
     return sorted(qs, key=operator.attrgetter('pin_count')) 
0

我的天堂我自己並沒有這樣做,但似乎有解決方案(其中一個是爲所討論的模型定義ModelManager的另一個,另一個依賴於管理界面魔術): Django admin: how to sort by one of the custom list_display fields that has no database field

你的情況的問題是,有問題的模型是用戶模型,這可能不是一個好主意來改變。在你的情況下,我建議添加一個自定義的用戶配置文件模型,如下所述: Django user profile

如果您需要頻繁查詢此值,我建議實現用戶中每個用戶的pinCount值輪廓模型。根據您的要求,您可以使用數據庫觸發器來更新此值。