Ich habe Probleme mit dem neuenAnmerkungen über mehrere Tabellen mit Django 1.8 ORM
Lassen Sie uns sagen, ich habe die folgenden 3 Modelle:
class Author(models.Model):
name = models.TextField()
class Book(models.Model):
author = models.ForeignKey(Author, related_name='books')
title = models.TextField()
is_fiction = models.BooleanField()
class SpeakingEvent(models.Model):
author = models.ForeignKey(Author, related_name='events')
date = models.DateField()
Und ich wollte eine einzige queryset von Autoren bekommen kommentierten mit der Anzahl der veröffentlichten Belletristikbücher und der Anzahl der zukünftigen Vortragsveranstaltungen.
Also, ich kann folgendes tun:
Author.objects.all().annotate(
future_speaking=Sum(Case(
When(events__date__gte=timezone.now(),
then=1),
default=0)),
fiction_count=Sum(Case(
When(books__is_fiction=True,
then=1),
default=0)),
)
Jedoch sind die resultierenden Zahlen zu hoch. Wenn es m Bücher und n Ereignisse gibt, dann enden wir die <correct_result> * m
für die Ereigniszählung, <correct_result> * n
für die Buchzählung. Dies liegt daran, dass django die beiden Tabellen zusammen mit einem linken Join verbindet. Die Ergebnisse sind korrekt, wenn ich eine der Anmerkungen weglasse.
Gibt es eine Möglichkeit, entweder die Joins zu ändern, entfernen Sie die Duplikate mit einer WENN-Klausel?
Dies scheint dies zu sein: https://docs.djangoproject.com/en/1.8/topics/db/aggregation/#combining-multiple-aggregations Aufzucht sie den Kopf. Leider ist mein Fall nicht nur auf Count() beschränkt, sondern ich füge einen Workaround hinzu, den ich mir ausgedacht habe – JeffS