簡體   English   中英

Django Admin,使用自定義函數排序

[英]Django Admin, sort with custom function

如何通過一些簡單的自定義方法對 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'不起作用,我需要以某種方式將其作為字段附加,但我不知道如何。

通過以下:

我們可以為您的問題撰寫解決方案:

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字段設置為管理面板上查詢集的排序字段。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM