2012-06-06 8 views

Antwort

4

Es ist sehr einfache Methode, die mit den App kaum vergleichbar ist, aber hoffen, dass Sie es finden nützlich:

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

Ich habe dies getestet und es scheint, die gleichen Abfragen wie die naive Schleife zu generieren ... Ich glaube nicht, dass Sie select_related auf eine umgekehrte Beziehung verwenden können – alan

+2

Es tut mir leid - natürlich sollte es prefetch_related (Ich bearbeitete meine Antwort). Das Verwenden dieses Lochs, das mit all() gesetzt ist, wird vorab geholt und das Iterieren sollte nicht auf die Datenbank treffen. – jasisz

1

Ja, es kann auf diese Art und Weise erfolgen:

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

Wenn Sie in Autor Modell vorhanden gefiltert werden soll durch ein Attribut (Name) können Sie einfach filtern, indem Sie schreiben:

authors.filter(name='your_value') 

Aber wenn Sie Filter auf der Bücher-Modell anwenden möchten, müssen Sie die folgende Art und Weise schreiben:

authors.filter(book__created__gt='your_date') 

Dies wird f Legen Sie alle Bücher mit dem Erstellungsdatum (das im Buchmodul erstellte Attribut) über Ihr Datum hinaus fest.