Pergunta

O Aqui parte da minha do Django aplicativo 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")

e aqui estão as partes correspondentes do admin.py do meu app:

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)

Na admin, isso produz uma lista de alterações da seguinte forma:

screencap
(fonte: sampablokuper.com )

Como você pode ver, embora a lista de alterações povoa cada linha da coluna Pessoa com a saída do __unicode () __ método do Person classe, ele faz não fim as linhas dessa coluna pelo __unicode () __ método do Person classe.

Como posso fazê-lo fazê-lo?

Muito obrigado antecipadamente!

Foi útil?

Solução

Django ordenação é feita no nível de banco de dados. A menos que você armazenar o resultado da sua função unicode no DB, o Django não vai ser capaz de resultados de retorno nativamente ordenados em que a moda.

Armazenar um valor de ordenação no DB é provavelmente a maneira mais conveniente para resolver este problema.

Outras dicas

Basta clicar o mesmo problema, e eu encontrei o seguinte link útil. Em vez de classificar por unicode, ele tenta classificar por várias colunas, o que pode ajudar a resolver o problema:

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

A seguir Paul McMillan do sugestão , eu adicionei a seguinte linha à definição de classe de Person :

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

Eu também colocar o presente acima da PersonName definição em 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()

e colocar isso abaixo do PersonName definição em models.py:

post_save.connect(post_save_person_and_person_name, sender=PersonName)

Até agora, tão bom.

Eu acho que eu poderia ser capaz de melhorá-lo, substituindo a chamada save () acima com uma atualização de queryset (). Eu tinha sugestões de boas-vindas nessa frente!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top