2017-12-21 5 views
0

Ich bin erfolglos versucht, die Lösung für diesen einfachen Fall googlen:Django Abfrage mit Annotate und wählen zusammen verwandt

Es gibt Buch und Autor-Modelle. Ich kann mehrere gleiche Bücher (mit unterschiedlichen IDs) haben. Autor ist ein Fremdschlüssel in Buch.

Ich brauche einen einfachen Weg, um alle Bücher, ihre Anzahl und Autorennamen aufzulisten.

ich tun kann:

Book.objects.values("book_name","author").annotate(count=Count("book_name")

, die mir ein Array, in dem aditional Wert mit der Zählung der "Book_Name" Elemente gibt. Aber statt Autorenname wird nur die Objekt-ID des Autors zurückgegeben.

kann ich den Namen des Autors erhalten

Book.objects.select_related() 

mit denen des Autors ID mit verwandten Objekt ersetzt, damit ich die author.name bekommen kann, aber es funktioniert nicht mit .values()

Irgendeine Idee, wie man das zusammen arbeiten? also kann ich sowohl die Anzahl der Bücher als auch die Namen der Autoren zählen lassen?

Ich möchte eine komplexe Lösung wie Abfragen von Books und innerhalb der Schleifenkonstruktion eines Ergebnisarrays vermeiden und Authors Name für jedes Buch abfragen.

Vielen Dank. TC

+0

Können Sie Ihre models.py Datei teilen? Wir brauchen mehr Informationen, um Ihnen zu helfen. Es scheint, dass Ihre Anfrage Struktur ist falsch –

Antwort

2

select_related ist ein totaler Hering hier; Es ist nie benötigt, um auf die Elemente eines verwandten Modells zuzugreifen, alles, was es macht, ist effizienter.

Wie bei allen anderen Abfragetypen verwenden Sie für den Zugriff auf die verwandten Elemente einfach die Doppelstring-Syntax. Angenommen, Ihren Autor Modell hat ein name Feld:

Book.objects.values("book_name","author__name").annotate(count=Count("book_name") 

Hinweis, ich finde es schwer zu verstehen, was Ihre Frage ist; Wie viele Buchnamen sollen gezählt werden? Ich vermute, was Sie eigentlich wollen, ist eine Liste von Autorennamen und eine Zählung ihrer Bücher, in diesem Fall sollten Sie von Autor nicht buchen beginnen.)

+0

Danke, wird so schnell wie möglich versuchen. In der Zwischenzeit lass mich meinen Fall klären. Ich kann mehrere identische Kopien eines Buches haben, also muss ich wissen, wie viele von ihnen ich habe. (Ich weiß, dass ich ein neues Feld count_of_books verwenden kann - in Wirklichkeit sind das HW-Geräte mit verschiedenen Teilenummern, aber vom selben Typ.) –

+0

Vielen Dank - es funktioniert perfekt - ich wusste nichts über diesen doppelten Unterstreichungsansatz;) –

Verwandte Themen