Django admin: Как изменить порядок list_filter?

У меня есть набор данных с моделями, которые показывают год. Мне нужно сделать обратный порядок. По умолчанию интерфейс администратора Django показывает год в порядке возрастания значения числа (например, 2021, 2022 и т.д.). Я хочу, чтобы фильтр отображал 2022, 2021,

models.py

...

def model(models.Model):
   year = models.IntegerField()

admin.py

...

class ModelAdmin(admin.ModelAdmin):
   list_filter = ("year")

Я думаю, что это очень тривиальный вопрос, но я еще не нашел решения. Заранее спасибо.

Полагаю, вы можете попробовать определить значение по умолчанию ordering в классе модели Meta:

class YourModel(models.Model):
    class Meta:
        ordering = ['-year', ]

Если это не работает для вас, единственный вариант для вас - использовать custom filter вот так:

from django.utils.translation import ugettext_lazy as _
from django.contrib.admin import SimpleListFilter

class YearFilter(SimpleListFilter):
    title = _('year')

    parameter_name = 'year'

    def lookups(self, request, model_admin):
        qs = model_admin.queryset(request)
        return [(i, i) for i in qs.values_list('year', flat=True) \
                                  .distinct().order_by('-year')]

    def queryset(self, request, queryset):
        if self.value():
            return queryset.filter(year__exact=self.value())

class ModelAdmin(admin.ModelAdmin):
    list_filter = (YearFilter,)

вы можете просто использовать order_by и обратный порядок. например, какой-нибудь шаблон вроде этого:

records=yourmodel.objects.filter(x=y).order_by('year').reverse
Вернуться на верх