Jak sortować według adnotacji Count () w powiązanym modelu w Django

Buduję bazę danych rejestrowania żywności w Django i mam problem związany z zapytaniami.

Skonfigurowałem moje modele tak, aby obejmowały (między innymi) model żywności połączony z modelem użytkownika za pośrednictwem „konsumenta” pola M2M za pośrednictwem modelu konsumpcji. Model żywności opisuje potrawy spożywcze, a model konsumpcji opisuje spożycie żywności przez użytkownika (data, ilość itp.).

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")

Chcę utworzyć kwerendę, która zwraca wszystkie obiekty żywności uporządkowane według liczby wyświetleń tego obiektu żywności w tabeli zużycia dla tego użytkownika (liczba przypadków, w których użytkownik zużył żywność).

Próbuję czegoś w rodzaju:

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

Ale to oczywiście policzy wszystkie obiekty konsumpcyjne związane z obiektem Food, a nie tylko te związane z użytkownikiem. Czy muszę zmienić moje modele, czy po prostu brakuje mi czegoś oczywistego w zapytaniach?

Jest to operacja bardzo krytyczna pod względem czasu (między innymi służy do wypełnienia pola Autouzupełnianie w Frontend), a tabela Food ma kilka tysięcy wpisów, więc wolę raczej sortować w końcu bazy danych niż wykonując metodę brute force i sprawdzając wyniki, wykonując:

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

a następnie za pomocą sortowania Pythona do ich sortowania. Nie sądzę, aby ta metoda skalowała się bardzo dobrze, ponieważ baza użytkowników wzrasta, a ja chcę zaprojektować bazę danych jako dowód na przyszłość, tak jak mogę od samego początku.

Jakieś pomysły?

questionAnswers(2)

yourAnswerToTheQuestion