Заказ экземпляра пользовательской модели через Meta? - PullRequest
0 голосов
/ 02 ноября 2018

Я не могу получить заказной порядок по умолчанию для экземпляров моей модели страницы. Они всегда сортируются по возрастанию pk.

Это приводит к неинтуитивным выпадающим спискам, выборам (например, CheckboxSelectMultiple) и т. Д .; особенно когда есть много предметов / экземпляров.

Вариант использования: модель AuthorPage и модель PublicationPage:

class AuthorPage(Page):
    first_name = CharField(max_length=255)
    last_name = CharField(max_length=255)

    class Meta:
        ordering = ['last_name', 'first_name']

class ArticlePage(Page):
    authors = ParentalManyToManyField('AuthorPage',)
    content_panels = Page.content_panels + [
        FieldPanel('authors', widget=CheckboxSelectMultiple),
    ]

Мне нравится, что мой CheckboxSelectMultiple соблюдает мета-порядок соответствующей модели, здесь AuthorPage и отображает упорядоченный по алфавиту список авторов. Но вместо этого я получаю этот список в порядке pk экземпляров автора. Кажется, ordering в классе AuthorPage не оценивается / не используется.

Такой же (нежелательный) порядок появляется в выпадающих списках авторов и в оболочке python при проверке набора запросов AuthorPage по умолчанию (AuthorPage.objects.all()).

Как заставить трясогузку упорядочить экземпляры модели моей страницы по пользовательским критериям (не pk)?


Установка:

  • Джанго 2.0.8
  • трясогузка 2.2.2

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Другая возможность - расширить и изменить значение по умолчанию PageManager для этого класса модели (опять же: спасибо @allcaps):

class ProfilePageManager(PageManager):
    def get_queryset(self):
        return super().get_queryset().order_by('last_name', 'first_name')

class ProfilePage(Page):
    objects = ProfilePageManager()

Менеджер страниц по умолчанию возвращает набор запросов с order_by('path') [1], поэтому я изменил это, чтобы возвращать набор запросов, упорядоченный по моим пользовательским критериям: order_by('last_name', 'first_name').

Теперь виджеты (например, CheckboxSelectMultiple), раскрывающиеся списки и т. Д. Получают этот упорядоченный набор запросов в виде опций / вариантов для всего сайта без необходимости изменять их существующие экземпляры.

[1] https://github.com/wagtail/wagtail/blob/master/wagtail/core/models.py#L191

0 голосов
/ 04 ноября 2018

Вы предполагаете, что порядок страниц Wagtail по pk неверен. Трясогузка упорядочивает страницы по пути (трясогузка использует django-treebeard). Это позволяет пользовательский порядок. Сначала щелкните символ заказа (первый столбец), затем перетащите страницы.

Wagtail Page list ordering

Вот что говорят документы:

Модели, основанные на страницах нельзя присвоить упорядочение по умолчанию, используя стандартный подход Django для добавления атрибута упорядочения во внутренний мета-класс.

Это потому, что Page заставляет упорядочивать QuerySets по пути. Вместо этого вы должны применять порядок явно при создании QuerySet:

news_items = NewsItemPage.objects.live().order_by('-publication_date')

Документы: https://docs.wagtail.io/en/v2.3/topics/pages.html#page-queryset-ordering

Можете ли вы попытаться определить выбор - и, следовательно, порядок - самостоятельно? Примерно так может работать:

FieldPanel(
    'authors', 
    widget=CheckboxSelectMultiple(
        choices=ProfilePage.objects.all().order_by('title').values_list('pk', 'title')
    )
),
...