如何在Django的ORM中以一对多关系搜索字段的模式?

问题描述

我在菜和餐厅之间有一对多的关系。

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最多的