问题描述
我在菜和餐厅之间有一对多的关系。
SPICInesS_CHOICES = (
("M","Mild")
("H","Hot")
("SH","Super hot")
)
class Restaurant(Model):
name = models.CharField(max_length=50)
class dish(Model):
restaurant = models.ForeignKey(Restaurent)
name = models.CharFiedl(null=True,max_length=50)
price = models.IntegerField(max_length=10,null= False)
spicy = models.CharField(null= True,choices=SPICInesS_CHOICES)
我希望能够搜索“餐厅”,以查看其菜肴最常见的辣味或菜肴的辣味模式https://en.wikipedia.org/wiki/Mode_(statistics)。 Django似乎没有轻松实现此功能的功能。 假设我们有3家餐厅,分别是Anny's,Domino和Verspucie。
安妮(Anny's)有8种不同的菜肴,其中2种被标记为“热”,所有其他菜肴均被标记为“轻度”,因为所有者希望能够为儿童提供多样化的菜单
多米诺骨牌有9种不同的菜肴,其中5种被标记为“热”,2种被标记为“超级热”,2种被标记为“温和”。
Verspucie有10种不同的菜肴,其中8种被标记为“超级热”,其中1种被标记为“轻度”,另外1种被标记为“热”。
因为我想从整个餐馆列表中找到正确的餐馆,所以我希望能够搜索餐馆中最常见的菜肴风味。在postgres中,可以使用mode函数来执行此操作,然后将该mode值连接到restaurant表。 如果我想开一家主要提供超级热菜的餐厅,我的查询将如下所示:
SELECT * FROM "restaurant" LEFT OUTER JOIN (SELECT "dish"."restaurant_id",mode() WITHIN GROUP (ORDER BY "dish.spicy") AS "mode_spicy" FROM dish GROUP BY "dish"."restaurant_id") mode_table ON "id"="mode_table"."taxonomy_id") WHERE "mode_spicy"='SH';
这将产生Verspucie餐厅,因为它是唯一一家大多数菜肴都标有“超级热”的餐厅。但是现在我想在django ORM语言中执行此操作,但我在django中找不到mode()函数。
解决方法
from django.db.models import Count,IntegerField,When,Case
Restaurant.objects.annotate(
numcount=Count(Case(
When(dish__spicy="SH",then=1),output_field=IntegerField(),))
).order_by("-numcount")
此查询将计算每家餐厅的SH
麻辣菜肴的数量,
您可以订购此商品,然后根据您的逻辑检查查找餐馆中SH
最多的