1

如何对 readonly_fields 进行排序/排序(请参阅https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.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 对列表进行排序。由于它不是直接的数据库字段,因此根据文档这是不可能的。有什么办法吗?

谢谢!

4

2 回答 2

0

排序由数据库完成,而不是由管理员完成(这是更改列表上的调试工具栏输出):

在此处输入图像描述

这就是为什么您不能使用自定义管理方法订购的原因。您可以通过覆盖方法Count向管理员的查询集添加注释: ModeAdmin.queryset

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')

或者如果您需要更多控制,您可以尝试对管理员显示的查询集进行排序,但我尚未对此进行测试:

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'))
于 2012-11-24T13:57:14.203 回答
0

我自己没有这样做,但似乎有解决方案(一个涉及为相关模型定义自定义 ModelManager,另一个依赖于管理界面魔法): Django admin: how to sort by one of the custom list_display 没有数据库字段的字段

您的问题是有问题的模型是用户模型,这可能不是一个好主意。在您的情况下,我建议添加自定义 UserProfile 模型,如下所述: Django user profile

如果您需要经常查询此值,我建议您在用户配置文件模型中为每个用户具体化 pinCount 值。根据您的要求,您可以使用数据库触发器来更新此值。

于 2012-11-24T14:01:47.940 回答