Переопределение набора запросов Django ModelAdmin не работает - PullRequest
4 голосов
/ 31 января 2011

Я пытаюсь переопределить queryset () класса ModelAdmin, чтобы список объектов, отображаемых в admin, был отсортирован по двум уровням .

Я попробовал следующий код, но он не работает, то есть таблица не отсортирована, как ожидалось

class ProductAdmin(admin.ModelAdmin):
    def queryset(self, request):
        qs = super(ProductAdmin, self).queryset(request)
        return qs.order_by('category','market')

    list_display = ('category', 'market', 'name', 'quantity')

admin.site.register(Product, ProductAdmin)

кстати, вы не можете использовать ordering = ('category','market'), поскольку django определенно заявляет, что вступает в силу только первый элемент в упорядоченном кортеже (см. Примечание в документации здесь )

Ответы [ 3 ]

7 голосов
/ 19 июня 2015

get_queryset работает в Django 1.8.

3 голосов
/ 16 марта 2011

У меня была именно эта проблема. Вот что я сделал:

Я вложил в подкласс ChangeList и переопределил ChangeList.get_query_set, чтобы восстановить правильный order_by, который был ранее изменен на ChangeList.get_ordering:

Это то, что я сделал в моем случае (я использую django-easytree, но то же самое относится и к django-mptt):

class MyChangeList(ChangeList):

    def get_query_set(self):
        qs = super(MyChangeList, self).get_query_set()

        return qs.order_by('tree_id', 'lft')

Также проверьте эти билеты:

1 голос
/ 21 сентября 2012

Примечания к выпуску для Django 1.4 говорят, что Django теперь поддерживает Multiple sort in admin interface:

Список изменений администратора теперь поддерживает сортировку по нескольким столбцам. Это уважает все элементы атрибута упорядочения и сортировки по несколько столбцов, нажав на заголовки, предназначен для имитации поведение настольных графических интерфейсов.

А из ModelAdmin заказывает :

Установите ordering, чтобы указать порядок упорядочения списков объектов в Джанго админ просмотров. Это должен быть список или кортеж в том же формате в качестве параметра ordering модели. [...] Джанго чтит все элементы в списке / кортеже; до 1.4 уважалось только первое.

На полусвязанной заметке - если вы переопределяете queryset для предоставления пользовательского порядка сортировки, кажется, что Changelist переопределит этот порядок сортировки. Он применяет любую сортировку, найденную в параметре ordering, и, если ее нет, применяет сортировку по умолчанию на pk, тем самым сводя на нет любую сортировку, которую вы делали в queryset.

Я думаю это должно сработать - по крайней мере этот Билет Django говорит исправлено . Но я просто пытался применить пользовательскую сортировку, используя queryset несколько дней назад, и у меня это не сработало. Даже сортировка по одному полю, казалось, была переопределена в конечном виде. Так что либо я сделал что-то не так, либо это не все исправлено. :)

Обратите внимание, что позволяет выполнять пользовательскую сортировку с помощью кода, но вы должны создать подкласс Changelist и переопределить его get_query_set() метод согласно этого фрагмента . (Хотя это излишне, если вам нужно отсортировать только несколько полей, поскольку Django 1.4 теперь поддерживает несколько полей).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...