2009-06-11 11 views
37

Attualmente sto imparando Django e alcuni dei miei modelli hanno metodi personalizzati per ottenere valori formattati in un modo specifico. È possibile utilizzare il valore di uno di questi metodi personalizzati che ho definito come una proprietà in un modello con order_by()?Utilizzo di una proprietà del metodo del modello personalizzato Django in order_by()

Ecco un esempio che dimostra come la proprietà è implementata.

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 questo modello che posso fare:

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

Ma non posso fare:

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

Quale sarebbe il modo corretto di utilizzare order_by su una proprietà personalizzata come questo?

risposta

62

No, non puoi farlo. order_by viene applicato a livello di database, ma il database non può sapere nulla sui metodi Python personalizzati.

È possibile utilizzare i campi separati per ordinare:

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

o fare l'ordine in Python:

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

Forse 'F()' oggetti funzionerà in questo caso. Non ho provato, ma forse ordinando con 'F ('first_name') + '' + F ('last_name')'? –

+0

Per ordinare per _multiple_ campi personalizzati con 'sorted' puoi usare key = attrgetter come descritto su https://wiki.python.org/moin/HowTo/Sorting – Chirael

Problemi correlati