2012-11-24 115 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值轮廓模型。根据您的要求,您可以使用数据库触发器来更新此值。