首页 > 解决方案 > 在 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添加字段“父”,则该列按主键排序。

示范:

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

在此处输入图像描述

完成此任务的正确或最优雅的方法是什么?我已经看到建议通过向 MediumAdmin 添加一个返回父标签的自定义方法,然后将 @admin.display(ordering='parent__label') 装饰器应用到它,但我觉得我错过了更多正确的方法,因为这肯定是一个普遍的需求。

标签: pythondjangodjango-admin

解决方案


你可以这样做:

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

这就是我这样做的方式,到目前为止它一直有效。


推荐阅读