#python #django #django-admin
Вопрос:
У меня есть таблица с отношением «Многие к одному», облегчающая древовидную структуру:
class Medium(models.Model): label = models.CharField(max_length=30) parent = models.ForeignKey('self', on_delete=models.CASCADE, null=True) def __str__(self): return self.label
В представлении списка изменений администратора Django я хотел бы показать второй столбец с меткой родительского носителя для контекста — и я хотел бы, чтобы столбец можно было сортировать на основе метки. Однако, если я использую list_display
для добавления поля «родительский», этот столбец сортируется по первичному ключу.
Демонстрация:
@admin.register(Medium) class MediumAdmin(admin.ModelAdmin): list_display = ('label', 'parent', 'parent_id')
Каков правильный или наиболее элегантный способ достижения этой цели? Я видел предложения сделать это, добавив пользовательский метод в MediumAdmin, который возвращает родительскую метку, а затем примените к нему декоратор @admin.display(заказ= «родительская__метка»), но я чувствую, что мне не хватает более правильного способа, так как это, безусловно, общая потребность.
Ответ №1:
Ты мог бы сделать это:
@admin.register(Medium) class MediumAdmin(admin.ModelAdmin): list_display = ('label', 'parent', 'parent_id') ordering = ('parent__label',)
Именно так я это делаю, и до сих пор это всегда срабатывало.
Комментарии:
1. Это будет применять порядок в любое время в дополнение к порядку, вызванному щелчком по заголовку столбца. Что я хочу, так это иметь возможность щелкнуть по родительскому столбцу и отсортировать все строки в алфавитном порядке по значению родительской метки.