В представлении списка изменений в 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')
Какой правильный или наиболее элегантный способ достижения этой цели? Я видел предложения сделать это путем добавления пользовательского метода в MediumAdmin, который возвращает родительскую метку, а затем применить к ней декоратор @admin.display(ordering='parent__label'), но мне кажется, что я упускаю более правильный способ, поскольку это, несомненно, является общей потребностью.
Вы можете сделать следующее:
@admin.register(Medium)
class MediumAdmin(admin.ModelAdmin):
list_display = ('label', 'parent', 'parent_id')
ordering = ('parent__label',)
Вот как я это делаю, и это всегда работало до сих пор.