В представлении списка изменений в 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 Admin я хотел бы показать второй столбец с меткой родительского носителя для контекста - и я хотел бы, чтобы столбец мог сортироваться на основе метки. Однако, если я использую list_display для добавления поля 'parent', этот столбец сортируется по первичному ключу.

Демонстрация:

@admin.register(Medium)
class MediumAdmin(admin.ModelAdmin):
    list_display = ('label', 'parent', 'parent_id')

enter image description here

Какой правильный или наиболее элегантный способ достижения этой цели? Я видел предложения сделать это путем добавления пользовательского метода в MediumAdmin, который возвращает родительскую метку, а затем применить к ней декоратор @admin.display(ordering='parent__label'), но мне кажется, что я упускаю более правильный способ, поскольку это, несомненно, является общей потребностью.

Вы можете сделать следующее:

@admin.register(Medium)
class MediumAdmin(admin.ModelAdmin):
    list_display = ('label', 'parent', 'parent_id')
    ordering = ('parent__label',)

Вот как я это делаю, и это всегда работало до сих пор.

Вернуться на верх