Django Admin,使用自定义功能排序

时间:2017-08-28 14:18:20

标签: python django sorting django-admin

如何通过一些简单的自定义方法对Django admin中的列进行排序? (我得到的所有答案都是使用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不是数据库中的字段,因此简单ratio.admin_order_field = 'ratio'无法工作,我需要以某种方式将其作为字段附加,但我不知道如何。

1 个答案:

答案 0 :(得分:2)

通过以下方式:

我们可以为您的问题撰写解决方案:

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_ration函数从queryset实例返回上述字段。
  • 最后:get_ratio.admin_order_field = 'ratio'ration字段设置为管理面板上查询集的排序字段。