我正在使用Django构建一个食品记录数据库,并遇到了查询相关的问题。
我已经设置了我的模型,其中包括了一个食品模型,通过消费模型上的M2M字段"consumer"与用户模型连接。食品模型描述食物菜肴,而消费模型描述用户对食品的消费(日期、数量等)。
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.objects.all().annotate(consumption_times = Count(consumer)).order_by('consumption_times')`
但是这将会计算与食品对象相关联的所有消费对象,而不仅仅是与用户相关联的消费对象。我需要更改我的模型还是在查询中漏掉了一些明显的东西?
这是一个相当时间紧迫的操作(除此之外,它还用于填充前端自动完成字段),而Food表有几千个条目,因此我宁愿在数据库端进行排序,而不是使用暴力方法并迭代结果执行以下操作:
Consumption.objects.filter(food=food, user=user).count()
然后使用Python的排序来对它们进行排序。我不认为随着用户数量的增加,这种方法会很好扩展,我希望从一开始就尽可能地设计出未来的数据库。
有什么想法吗?