2012-08-27 3 views
7

Betrachten Sie diese Abfrage:Gibt es im Django eine Möglichkeit, eine Abfrage mit einem verwandten Objekt in einer einzelnen Abfrage direkt zu kommentieren?

query = Novel.objects.< ...some filtering... >.annotate(
    latest_chapter_id=Max("volume__chapter__id") 
) 

Eigentlich, was ich brauche, bin jeden Novel mit seinem neuesten Chapter Objekt mit Anmerkungen zu versehen, so dass nach dieser Abfrage ich eine andere Abfrage auszuführen muß tatsächliche Objekte von kommentierten IDs auswählen. IMO das ist hässlich. Gibt es eine Möglichkeit, sie zu einer einzigen Abfrage zusammenzufassen?

+0

Könnten Sie stattdessen Kapitel mit Romanen kommentieren? –

+0

Scheint mir nicht möglich, denn ich brauche nur das neueste Kapitel für jeden Roman, aber ein Roman hat viele Kapitel, und Kapitel sind in verschiedenen Bänden. Soweit ich weiß, ist 'distinct()' in diesem Fall nutzlos (korrigiere mich, wenn ich falsch liege), und ich kenne keine andere Möglichkeit, genau ein Kapitel auszuwählen, außer vom Roman auszugehen. Irgendwelche Ideen? – SAPikachu

Antwort

2

Nein, es ist nicht möglich, sie zu einer einzigen Abfrage zusammenzufassen.

Sie können die folgenden blog post lesen, um zwei Problemumgehungen zu finden.

+2

Die Antwort von Rune-Kaagaard ist jetzt besser. – qznc

+1

Der verknüpfte Post schlägt die Verwendung von extra() in der Abfrage vor. Ab Django 1.8 wird extra() nicht empfohlen und wird nicht weiter unterstützt. – johanno

15

Ja, das ist möglich.

Um einen queryset mit allen Kapiteln zu erhalten, die die letzten in ihren Romanen sind, einfach tun:

from django.db.models.expressions import F 
from django.db.models.aggregates import Max 

Chapters.objects.annotate(last_chapter_pk=Max('novel__chapter__pk') 
      ).filter(pk=F('last_chapter_pk')) 

auf Django Getestet 1.7.

Verwandte Themen