Я создаю базу данных регистрации продуктов в Django, и у меня есть проблема, связанная с запросом.
Я установил свои модели для включения (помимо прочего) модели Food, подключенной к модели User, через "потребитель" M2M-поля через модель потребления. Модель Food описывает пищевые блюда, а модель потребления описывает потребление потребителем пищи (дата, количество и т.д.).
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")
Я хочу создать запрос, который возвращает все объекты Food, упорядоченные по количеству раз, когда объект Food отображается в таблице Consumption для этого пользователя (количество раз, когда пользователь потреблял пищу).
Я пытаюсь что-то сделать в строке:
Food.objects.all().annotate(consumption_times = Count(consumer)).order_by('consumption_times')`
Но это, конечно, будет считать все объекты Consumption, связанные с объектом Food, а не только те, которые связаны с пользователем. Нужно ли мне менять мои модели, или я просто пропущу что-то очевидное в запросах?
Это довольно критическая операция (среди прочего, она использовала для заполнения поля Autocomplete в Frontend), а таблица Food имеет пару тысяч записей, поэтому я предпочел бы сортировку в конце базы данных, вместо выполнения метода грубой силы и повторения результатов:
Consumption.objects.filter(food=food, user=user).count()
а затем используя сортировку python для их сортировки. Я не думаю, что этот метод будет очень хорошо масштабироваться по мере увеличения базы пользователей, и я хочу с самого начала создать базу данных в качестве будущего доказательства.
Любые идеи?