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