Django Admin: list_display () упорядочить по количеству связанных объектов - PullRequest
3 голосов
/ 30 апреля 2019

Представьте, что у вас есть модель Person, которая может иметь N Book экземпляров.

Я хочу отобразить количество книг, которые есть у человека, в представлении списка изменений администратора django.

Число легко отобразить (напишите собственный метод в PersonAdmin).

Но я не смог найти способ сделать его сортируемым по количеству книг, которые есть у человека.

Я прочитал документы для list_display , но не смог найти ответ.

В соответствии с документами можно использовать выражение запроса.Можно ли решить это таким образом?

После применения ответа это выглядит так.В этом случае каждый экземпляр имеет N записей журнала:

order-by-log-count

1 Ответ

6 голосов
/ 30 апреля 2019

Переопределите метод get_queryset() администратора модели с помощью методов annoate() и order_by().Затем определите вызываемую функцию ( book_count () ) для возврата значения на страницу списка изменений

<b>from django.db.models.aggregates import Count</b>

class PersonAdmin(admin.ModelAdmin):
    list_display = (<b>'book_count',</b> 'other_field')

    <b>def get_queryset(self, request):
        qs = super().get_queryset(request)
        qs = qs.annotate(book_count=Count('book')).order_by('-book_count')
        return qs

    def book_count(self, person_instance):
        return person_instance.book_count</b>

Почему я не добавил ordering?

Пока мы вызываем super(), Джанго выдаст исключения

...