Fim Django coluna listagem do admin por saída de __unicode () __ método
-
05-07-2019 - |
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:
(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!
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:
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!