À l'aide d'un Django modèle personnalisé propriété de la méthode dans order_by()
Je suis actuellement en apprentissage de Django et de certains de mes modèles ont des méthodes pour obtenir des valeurs formaté d'une manière spécifique. Est-il possible d'utiliser la valeur de l'une de ces méthodes personnalisées que j'ai défini comme une propriété dans un modèle avec order_by()?
Voici un exemple qui montre comment la propriété est mise en œuvre.
class Author(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=40)
email = models.EmailField(blank=True, verbose_name='e-mail')
def _get_full_name(self):
return u'%s %s' % (self.first_name, self.last_name)
full_name = property(_get_full_name)
def __unicode__(self):
return self.full_name
Avec ce modèle, je peux le faire:
>>> Author.objects.all()
[<Author: John Doh>, <Author: Jane Doh>, <Author: Andre Miller>]
>>> Author.objects.order_by('first_name')
[<Author: Andre Miller>, <Author: Jane Doh>, <Author: John Doh>]
Mais je ne peut pas faire:
>>> Author.objects.order_by('full_name')
FieldError: Cannot resolve keyword 'full_name' into field. Choices are: book, email, first_name, id, last_name
Quelle serait la bonne façon d'utiliser les order_by sur une propriété personnalisée comme ça?
Vous devez vous connecter pour publier un commentaire.
Non, vous ne pouvez pas le faire.
order_by
est appliquée au niveau base de données, mais la base de données ne peut pas savoir quelque chose au sujet de votre custom Python méthodes.Vous pouvez utiliser les champs séparés à l'ordre:
ou de faire le tri dans Python:
F()
objets de travail dans ce cas. Ne l'ai pas testé, mais peut-être commander parF('first_name')+' '+F('last_name')
?sorted
vous pouvez utiliser la touche=attrgetter comme décrit dans le wiki.python.org/moin/HowTo/Sortingsorted(CGHSSection.objects.all(), key=lambda a: a.modtitle)
, je reçoisTypeError: '<' not supported between instances of 'method' and 'method'