【问题标题】:Django admin: sorting/ordering dynamic readonly_fieldsDjango 管理员:排序/排序动态 readonly_fields
【发布时间】:2012-11-12 13:10:33
【问题描述】:

如何对 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 对列表进行排序。由于它不是直接的数据库字段,因此根据文档这是不可能的。有什么办法吗?

谢谢!

【问题讨论】:

    标签: django sorting admin


    【解决方案1】:

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

    这就是您无法使用自定义管理方法订购的原因。您可以通过覆盖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'))
    

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2011-06-02
        • 2013-05-09
        • 2016-12-05
        • 1970-01-01
        • 1970-01-01
        • 2016-10-09
        • 2012-10-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多