order_by python django django-models

python - Usar una propiedad de método de modelo personalizado de Django en order_by()



django order by date (1)

Actualmente estoy aprendiendo Django y algunos de mis modelos tienen métodos personalizados para obtener valores formateados de una manera específica. ¿Es posible usar el valor de uno de estos métodos personalizados que he definido como una propiedad en un modelo con order_by ()?

Aquí hay un ejemplo que demuestra cómo se implementa la propiedad.

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

Con este modelo puedo hacer:

>>> 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>]

Pero no puedo hacer:

>>> Author.objects.order_by(''full_name'') FieldError: Cannot resolve keyword ''full_name'' into field. Choices are: book, email, first_name, id, last_name

¿Cuál sería la forma correcta de usar order_by en una propiedad personalizada como esta?


No, no puedes hacer eso. order_by se aplica en el nivel de la base de datos, pero la base de datos no puede saber nada sobre sus métodos personalizados de Python.

Puede usar los campos separados para ordenar:

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

o hacer el pedido en Python:

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