Django Admin,使用自定义函数排序

mic*_*sza 7 python sorting django django-admin

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

假设模型

class Shots(models.Model):    
    hits = models.PositiveIntegerField()
    all = models.PositiveIntegerField()
Run Code Online (Sandbox Code Playgroud)

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

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

    def ratio(self, obj):
        return obj.hits / obj.all * 100
Run Code Online (Sandbox Code Playgroud)

我知道这ratio不是 DB 中的一个字段,因此简单的ratio.admin_order_field = 'ratio'行不通,我需要以某种方式将它附加为一个字段,但我不知道如何。

Joh*_*fis 10

依照指示:

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

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'
Run Code Online (Sandbox Code Playgroud)

解释:

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