如何通过一些简单的自定义方法对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'
无法工作,我需要以某种方式将其作为字段附加,但我不知道如何。
答案 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
的新字段注释为
你的查询集。该字段的值是您在hits
和all
字段中应用比率函数。get_ration
函数从queryset实例返回上述字段。get_ratio.admin_order_field = 'ratio'
将ration
字段设置为管理面板上查询集的排序字段。