在django admin中按__str__列启用排序

时间:2015-10-01 14:03:14

标签: django django-admin

我有一个django项目,其模型看起来像:

class Profile(models.Model):
    #some other stuff
    owner = models.OneToOneField(settings.AUTH_USER_MODEL)
    last_modified = models.DateTimeField(default = timezone.now)

    def __unicode__(self):
        return self.owner.name
    __unicode__.admin_order_field = 'owner__last_name'

我的模特管理员看起来像:

class ProfileAdmin(admin.ModelAdmin):
    ordering = ['-last_modified']
    list_display = ['__unicode__', 'last_modified']

我希望管理员默认按last_modified排序(就像现在一样),但是可以通过单击列表显示的第一列顶部按字母顺序排序。我尝试按照here所述添加__unicode__.admin_order_field行,但这似乎没有任何区别。我想要的是什么?如果不是为什么不呢?

1 个答案:

答案 0 :(得分:1)

您只能在django管理界面中对字段进行排序(如果它们是模型上的字段),或者它们是您在ModelAdmin类的get_queryset方法中自定义注释的字段 - 实际上是在数据库级别创建的字段。但是,假设您从模型的某些字段派生__unicode____str__方法(并且您来自owner.name),那么您应该能够引用这些字段并创建列像这样排序(虽然您可以使用此方法使 unicode 字段对您喜欢的任何模型属性进行排序):

class ProfileAdmin(admin.ModelAdmin):

    def sortable_unicode(self, obj):
        return obj.__unicode__()

    sortable_unicode.short_description = 'Owner Name'
    sortable_unicode.admin_order_field = 'owner__last_name'

    ordering = ['-last_modified']
    list_display = ['sortable_unicode', 'last_modified']

虽然我觉得有点奇怪的是,您将显示所有者name,但会在last_name上排序。当您想知道为什么排序顺序与管理界面中显示的name不匹配时,这可能会有点令人费解。