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, отсортированные в порядке возрастания, а потом все остальные.