2012-06-06 16 views

risposta

4

È molto semplice metodo che è difficilmente confrontabili con quelli app, ma spero lo troverete utile:

class Author(models.Model): 
    name = models.CharField(max_length=100) 

    def latest_book(self): 
     return max(self.book_set.all(), key=lambda book: book.created) 

authors = Author.objects.prefetch_related('book_set') 
authors[0].latest_book() # what you wanted 
+1

Ho provato questo e sembra generare le stesse query del ciclo naive ... Non penso che tu possa usare select_related su una relazione inversa – alan

+2

Mi dispiace - ovviamente dovrebbe essere prefetch_related (Ho modificato la mia risposta). L'uso di questo set di fori con all() è precaricato e iterando non dovrebbe colpire il database. – jasisz

1

Sì, si può fare in questo modo:

authors=Author.objects.prefetch_related('book_set') 

Se si desidera filtrare da un attributo (nome) presente nel modello Autore si può semplicemente filtrarlo scrivendo:

authors.filter(name='your_value') 

Ma se si desidera applicare il filtro sul modello libri dovete scrivere nel modo seguente:

authors.filter(book__created__gt='your_date') 

Questo sarà f cancella tutti i libri che hanno creato la data (attributo creato nel modulo Libro) maggiore della tua data.

Problemi correlati