So sortieren Sie nach mit Anmerkungen versehenem Count () in einem verwandten Modell in Django

Ich baue in Django eine Datenbank zum Protokollieren von Lebensmitteln auf und habe ein Problem mit der Abfrage.

Ich habe meine Modelle so eingerichtet, dass sie (unter anderem) ein Lebensmittelmodell enthalten, das über ein M2M-Feld "Verbraucher" über das Verbrauchsmodell mit dem Benutzermodell verbunden ist. Das Lebensmittelmodell beschreibt Lebensmittelgerichte und das Verbrauchsmodell beschreibt den Verbrauch von Lebensmitteln durch einen Benutzer (Datum, Menge usw.).

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 Lebensmittelobjekte zurückgibt, die nach der Häufigkeit sortiert sind, mit der dieses Lebensmittelobjekt in der Verbrauchstabelle für diesen Benutzer angezeigt wird (nach der Häufigkeit, mit der der Benutzer das Lebensmittel konsumiert hat).

Ich versuche etwas in der Zeile:

Food.objects.all().annotate(consumption_times = Count(consumer)).order_by('consumption_times')`

Dabei werden natürlich alle Verbrauchsobjekte gezählt, die sich auf das Food-Objekt beziehen, nicht nur die, die dem Benutzer zugeordnet sind. Muss ich meine Modelle ändern oder fehle ich nur etwas Offensichtliches in den Abfragen?

Dies ist eine ziemlich zeitkritische Operation (unter anderem wird sie verwendet, um ein Autocomplete-Feld im Frontend auszufüllen) und die Food-Tabelle enthält ein paar tausend Einträge. Daher würde ich die Sortierung lieber am Ende der Datenbank als am Ende durchführen Durchführen der Brute-Force-Methode und Iterieren der Ergebnisse durch Ausführen von:

Consumption.objects.filter(food=food, user=user).count()

und dann mit Python sortieren, um sie zu sortieren. Ich glaube nicht, dass diese Methode mit zunehmender Benutzerbasis sehr gut skalierbar ist, und ich möchte die Datenbank von Anfang an so zukunftssicher wie möglich gestalten.

Irgendwelche Ideen?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage