【问题标题】:Django Admin, sort with custom functionDjango Admin,使用自定义功能排序
【发布时间】:2018-02-05 20:28:07
【问题描述】:

如何通过一些简单的自定义方法在 Django 管理中对列进行排序?
(我得到的所有答案都是使用annotate,但我不知道如何使用它)。

假设模型

class Shots(models.Model):    
    hits = models.PositiveIntegerField()
    all = models.PositiveIntegerField()

在管理站点中,我想按hits to all 比率排序:

class ShotAdmin(admin.ModelAdmin):
    list_display = ['ratio']

    def ratio(self, obj):
        return obj.hits / obj.all * 100

我知道 ratio 不是 DB 中的字段,因此简单的 ratio.admin_order_field = 'ratio' 不起作用,我需要以某种方式将其附加为字段,但我不知道如何。

【问题讨论】:

    标签: python django sorting django-admin


    【解决方案1】:

    通过以下方式:

    我们可以为您的问题制定解决方案:

    from django.db.models import F
    
    class ShotsAdmin(admin.ModelAdmin):
        list_display = ('get_ratio',)
    
        def get_queryset(self, request):
            qs = super(ShotsAdmin, self).get_queryset(request)
            qs = qs.annotate(ratio=F('hits') * 100 / F('all'))
            return qs
    
        def get_ratio(self, obj):
            return obj.ratio
    
        get_ratio.admin_order_field = 'ratio'
    

    解释:

    • get_queryset 方法会将名为 ratio 的新字段注释为 你的查询集。该字段的值是您的比率函数在hitsall 字段上的应用。
    • get_ratio 函数从查询集实例返回上述字段。
    • 最后:get_ratio.admin_order_field = 'ratio'ratio 字段设置为管理面板上查询集的排序字段。

    【讨论】:

    • 非常感谢,如果应用以下修改,一切都会很好:1)在适当的类上调用super,即ShotsAdmin,2)ratio=(F('hits') * 100 / F('all')),因为它截断为最接近的整数跨度>
    • 很高兴知道@micsza 我会相应地编辑我的答案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-05
    • 1970-01-01
    • 2011-03-26
    • 2020-09-14
    • 2013-02-25
    • 1970-01-01
    相关资源
    最近更新 更多