40 votes

À 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 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?

67voto

Daniel Roseman Points 199743

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:

Author.objects.order_by('first_name', 'last_name')

ou faire la commande en Python:

sorted(Author.objects.all(), key=lambda a: a.full_name)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X