django-admin - 按 __unicode()__ 方法的输出对 Django 管理更改列表列进行排序

标签 django-admin sorting

这是我的 Django 应用的 models.py 的一部分:

class Person(models.Model):
    birth_year = WideYear(null=True, blank=True)
    birth_year_uncertain = models.BooleanField()
    death_year = WideYear(null=True, blank=True)
    death_year_uncertain = models.BooleanField()
    flourit_year = WideYear(null=True, blank=True)
    flourit_year_uncertain = models.BooleanField()
    FLOURIT_CHOICES = (
        (u'D', u'Birth and death dates'),
        (u'F', u'Flourit date'),
    )
    use_flourit = models.CharField('Date(s) to use', max_length=2, choices=FLOURIT_CHOICES)
    index_entries = models.ManyToManyField(IndexEntry, null=True, blank=True)
    def __unicode__(self):
        if self.personname_set.filter(default_name__exact=True):
            name = z(self.personname_set.filter(default_name__exact=True)[0])
        else:
            name = u'[Unnamed person]'
        if self.use_flourit == u'D':
            dates = '%s - %s' % (z(self.birth_year), z(self.death_year))
        else:
            dates = 'fl. ' + z(self.flourit_year)
        return '%s (%s)' % (name, dates)

class PersonName(models.Model):
    titles = models.CharField(max_length=65535, null=True, blank=True)
    surname = models.CharField(max_length=255, null=True, blank=True)
    first_name = models.CharField(max_length=255, null=True, blank=True)
    middle_names = models.CharField(max_length=255, null=True, blank=True)
    post_nominals = models.CharField(max_length=65535, null=True, blank=True)
    default_name = models.BooleanField()
    person = models.ForeignKey(Person, null=True, blank=True)
    def __unicode__(self):
        return '%s, %s %s' % (self.surname, self.first_name, self.middle_names)
    class Meta:
        unique_together = ("titles", "surname", "first_name", "middle_names", "post_nominals", "person")
        unique_together = ("default_name", "person")

这是我的应用程序 admin.py 的相应部分:

from reversion.admin import VersionAdmin

class PersonNameInline(admin.TabularInline):
    model = PersonName
    extra = 1

class PersonAdmin(VersionAdmin):
    radio_fields = {"use_flourit": admin.HORIZONTAL}
    inlines = [PersonNameInline]

admin.site.register(Person, PersonAdmin)

在管理中,这会生成如下更改列表:

screencap
(来源:sampablokuper.com)

正如您所看到的,虽然更改列表使用 Person 类的 __unicode()__ 方法的输出填充 Person 列的每一行,但它确实不通过 Person 类的 __unicode()__ 方法对该列的行进行排序。

我怎样才能做到这一点?

非常感谢!

最佳答案

Django 排序是在数据库级别完成的。除非您将 unicode 函数的结果存储在数据库中,否则 django 将无法 native 返回以这种方式排序的结果。

在数据库中存储排序值可能是解决此问题的最便捷方法。

关于django-admin - 按 __unicode()__ 方法的输出对 Django 管理更改列表列进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1406745/

相关文章:

sql - django-admin.py 转储数据到 SQL 语句

django - Django admin-排序list_filter

swift 2.0 : sort instead of sorted function

java - 按频率排序

c# - 双向冒泡排序 C#

python - 如何使用 Django Rest Framework 在 Django 中进行操作日志记录

python - 根据另一个字段中的选择显示/隐藏 django 管理表单字段

javascript - 为什么继续使迭代停止?

python - 如何使用 pandas groupby 对某些行进行降序排序,对某些行进行升序排序

django-admin - Django Admin中 ListView 和更改 View 的不同查询集优化