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?