我有一个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
行,但这似乎没有任何区别。我想要的是什么?如果不是为什么不呢?
答案 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
不匹配时,这可能会有点令人费解。