Ich baue eine Lebensmittel-Logging-Datenbank in Django und ich habe eine Abfrage bezogenen Problem.Sortieren nach annotierten Count() in einem verwandten Modell in Django
Ich habe meine Modelle so eingerichtet, dass sie unter anderem ein Food-Modell enthalten, das über das Consumption-Modell über ein M2M-Feld "Consumer" mit dem User-Modell verbunden ist. Das Food-Modell beschreibt Food-Gerichte und das Consumption-Modell beschreibt den Verzehr eines Lebensmittels (Datum, Menge, etc.).
class Food(models.Model):
food_name = models.CharField(max_length=30)
consumer = models.ManyToManyField("User", through=Consumption)
class Consumption(models.Model):
food = models.ForeignKey("Food")
user = models.ForeignKey("User")
Ich möchte eine Abfrage erstellen, die alle durch die Anzahl der bestellten Speisen Objekte zurückgibt, die Lebensmittel-Objekt für den Benutzer in der Verbrauchstabelle erscheint (die Anzahl der der Benutzer die Nahrung verbraucht hat).
Ich versuche, etwas in der Linie:
Food.objects.all().annotate(consumption_times = Count(consumer)).order_by('consumption_times')`
Aber das wird natürlich alle Verbrauchsobjekte zum Nahrungsmittelobjektbezogenen zählen, nicht nur die dem Benutzer zugeordnet diejenigen. Muss ich meine Modelle ändern oder fehle ich gerade etwas Offensichtliches in den Abfragen?
Dies ist eine ziemlich zeitkritische Operation (unter anderem wird es verwendet, um eine automatische Vervollständigung Feld im Frontend zu füllen) und die Nahrungsmitteltabelle hat ein paar tausend Einträge, also würde ich eher in der Datenbank die Sortierung tun Ende, anstatt die Brute-Force-Methode zu tun und die Ergebnisse iterieren tun:
Consumption.objects.filter(food=food, user=user).count()
und dann sortiert mit python, sie zu sortieren. Ich denke nicht, dass diese Methode sehr gut skalieren würde, da die Benutzerbasis zunimmt und ich die Datenbank so zukunftssicher wie möglich gestalten möchte.
Irgendwelche Ideen?
Mögliche Duplikat [Sortieren nach Zählung eines ForeignKey Feld?] (Http://stackoverflow.com/questions/2501149/order-by-count-of-a-foreignkey-field) –