Buduję bazę danych rejestrowania żywności w Django i mam problem związany z zapytaniem.Jak sortować według adnotacji Count() w pokrewnym modelu w Django
Skonfigurowałem moje modele, aby uwzględnić (między innymi) model Food podłączony do modelu użytkownika poprzez pole "konsumenta" M2M za pośrednictwem modelu konsumpcji. Model żywności opisuje potrawy z potraw, 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 zamówionej przez liczbę razy, że pojawia się obiekt żywności w tabeli zużyciu przez tego użytkownika (ile razy użytkownik spożywanego jedzenia).
Próbuję coś w linii:
Food.objects.all().annotate(consumption_times = Count(consumer)).order_by('consumption_times')`
ale to oczywiście liczyć wszystkie obiekty wydatkowe związane z przedmiotem jedzenie, nie tylko te związane z użytkownikiem. Czy muszę zmieniać modele lub czy brakuje mi czegoś oczywistego w zapytaniach?
Jest to dość czasochłonna operacja (między innymi służy do wypełniania pola autouzupełniania w interfejsie użytkownika), a tabela zawiera kilka tysięcy wpisów, więc wolę sortowanie w bazie danych koniec, zamiast robić metodę brute force i iteracyjne nad wynikami robi:
Consumption.objects.filter(food=food, user=user).count()
a następnie przy użyciu Pythona sortowania je posortować. Nie sądzę, że ta metoda skalowałaby się bardzo dobrze, ponieważ baza użytkowników wzrasta, a ja chcę zaprojektować bazę danych jako dowód przyszłości, jak tylko mogę od samego początku.
Wszelkie pomysły?
Możliwy duplikat [Zamówienia hrabiego polu ForeignKey?] (Http://stackoverflow.com/questions/2501149/order-by-count-of-a-foreignkey-field) –