В представлении списка изменений администратора Django, как сделать так, чтобы столбец внешнего ключа сортировался по значению, отличному от первичного ключа?

#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. Это будет применять порядок в любое время в дополнение к порядку, вызванному щелчком по заголовку столбца. Что я хочу, так это иметь возможность щелкнуть по родительскому столбцу и отсортировать все строки в алфавитном порядке по значению родительской метки.