icw82
@icw82
Веб-разработчик

Как заставить админку по умолчанию сортировать по виртуальному полю?

models.py:
from django.db import models

class Ordered(models.Model):
    position = models.PositiveSmallIntegerField(
        'Позиция',
        null = True,
        blank = True
    )

    def unordered(self):
        return self.position == None

admin.py:
from django.contrib import admin

class OrderedAdmin(admin.ModelAdmin):
    list_display = ('position', 'unordered', )
    ordering = ('-unordered', 'position', )
    fields = ('position', )


Джанга возвращает ошибку (admin.E033), мол атрибута unordered у модели нет.
Если убрать ordering, то в админке мы увидим колонку unordered.

Сортировать по виртуальному параметру всё таки можно заставить, изменив admin.py:
from django.contrib import admin

class OrderedAdmin(admin.ModelAdmin):
    list_display = ('position', 'is_unordered', )
    fields = ('position', )

    def get_queryset(self, request):
        qs = super(OrderedAdmin, self).get_queryset(request)
        qs = qs.annotate(is_unordered = models.Count('position'))
        return qs

    def is_unordered(self, obj):
        return obj.is_unordered
    is_unordered.admin_order_field = 'is_unordered'

В админке появляется возможность сортировать колонку is_unordered, однако вернув
ordering = ('-is_unordered', 'position', ) Джанга снова выкинет ту же самую ошибку.

Задача: чтобы админка по умолчанию сортировала так: сначала все элементы имеющие position, отсортированные в порядке возрастания, а потом все остальные.
  • Вопрос задан
  • 401 просмотр
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы