Используйте результат запроса от многих ко многим отношениям для сортировки списка в django admin - PullRequest
0 голосов
/ 09 октября 2018

Вот как выглядит мой класс Admin

class GuestAdmin(admin.ModelAdmin):
    inlines = (GuestEpisodeAdmin, TopicGuestAdmin, JobGuestAdmin)
    exclude = ('episodes', )
    list_display = ('name', 'twitter', 'gender', 'medium', 'appearance_count', 'last_appearance')
    list_filter = ['gender']
    search_fields = ['name', 'twitter', 'bio', 'notes']

    def get_queryset(self, request):
        qs = super(GuestAdmin, self).get_queryset(request)
        qs = qs.annotate(
            _appearance_count=Count('episodes')
        )
        return qs

    def appearance_count(self, obj):
        return obj._appearance_count

    def last_appearance(self, obj):
        la = obj.episodes.order_by('-published_at').values_list('published_at', flat=True).all().first()
        if isinstance(la, datetime.datetime):
            la = la.strftime("%Y-%m-%d")
        return la

    # last_appearance.admin_order_field = 'last_appearance'
    appearance_count.admin_order_field = '_appearance_count'

Таким образом, last_appearance происходит из эпизодов, связанных с гостем (отношение «многие ко многим») с использованием даты публикации из новейшего эпизода.Моя цель - сделать так, чтобы их можно было сортировать в виде списка администратора django.

Я узнал, что не могу получить это в get_queryset, но я уверен, что есть способ.Я пока не смог найти.

1 Ответ

0 голосов
/ 10 октября 2018

Вы можете использовать функцию Max для аннотирования queryset, которая также работает на DateTimeField с, поэтому вы можете реализовать это в методе get_queryset():

def get_queryset(self, request):
    qs = super(GuestAdmin, self).get_queryset(request)
    qs = qs.annotate(
        _appearance_count=Count('episodes'),
        _last_appearance=Max('episodes__published_at')
    )
    return qs

...
last_appearance.admin_order_field = '_last_appearance'
...