Упорядочить столбец списка изменений администратора Django путем вывода метода __unicode () __

StackOverflow https://stackoverflow.com/questions/1406745

  •  05-07-2019
  •  | 
  •  

Вопрос

Вот часть models.py моего приложения Django:

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 , он выполняет не упорядочивайте строки этого столбца с помощью метода __unicode () __ класса Person .

Как я могу это сделать?

Заранее большое спасибо!

Это было полезно?

Решение

Упорядочение Django выполняется на уровне базы данных. Если вы не сохраните результат своей функции юникода в БД, django не сможет вернуть результаты, упорядоченные таким образом.

Хранение значения порядка в БД, вероятно, является наиболее целесообразным способом решения этой проблемы.

Другие советы

Просто попал в ту же проблему, и я нашел следующую ссылку полезной. Вместо сортировки по юникоду, он пытается сортировать по нескольким столбцам, что может помочь решить проблему:

http://djangosnippets.org/snippets/2110/

После Пола Макмиллана я добавил следующую строку в определение класса Person :

ordering_string = models.CharField(max_length=255, null=True, blank=True)

Я также поместил это выше определения PersonName в models.py:

def post_save_person_and_person_name(sender, **kwargs):
    person_name = kwargs['instance']
    person = person_name.person
    if person.ordering_string != unicode(person)[0:254]:
        person.ordering_string = unicode(person)[0:254]
        super(Person, person).save()

и поместите это ниже определения PersonName в models.py:

post_save.connect(post_save_person_and_person_name, sender=PersonName)

Пока все хорошо.

Я думаю, что смогу улучшить его, заменив вышеупомянутый вызов save () на updateset update (). Я приветствовал бы предложения на этом фронте!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top