2009-06-11 13 views
37

Ich lerne gerade Django, und einige meiner Modelle verfügen über benutzerdefinierte Methoden, um Werte auf eine bestimmte Weise zu formatieren. Ist es möglich, den Wert einer dieser benutzerdefinierten Methoden zu verwenden, die ich als Eigenschaft in einem Modell mit order_by() definiert habe?Verwenden einer Django-Eigenschaft für benutzerdefinierte Modellmethoden in order_by()

Hier ist ein Beispiel, das zeigt, wie die Eigenschaft implementiert wird.

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 

Mit diesem Modell, das ich tun kann:

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

Aber ich kann nicht tun:

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

Was wäre die richtige Art und Weise zu verwenden order_by auf einer benutzerdefinierten Eigenschaft wie das?

Antwort

62

Nein, das geht nicht. order_by wird auf Datenbankebene angewendet, aber die Datenbank kann nichts über Ihre benutzerdefinierten Python-Methoden wissen.

Sie können entweder die einzelnen Felder verwenden, um zu bestellen:

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

oder die Reihenfolge in Python tun:

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

Vielleicht 'F()' Objekte werden in diesem Fall arbeiten. Habe nicht getestet, aber vielleicht mit 'F ('first_name') + '' + F ('last_name')'? –

+0

Um nach _multiple_ benutzerdefinierten Feldern mit 'sorted' zu sortieren, können Sie key = attrgetter verwenden, wie unter https://wiki.python.org/moin/HowTo/Sorting beschrieben – Chirael

Verwandte Themen