【问题标题】:How to search for the mode of a field in a one to many relationship in django's ORM?如何在django的ORM中搜索一对多关系中字段的模式?
【发布时间】:2020-10-28 13:05:21
【问题描述】:

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

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 道菜标记为 Hot,所有其他菜都标记为 Mild,因为老板希望能够为儿童提供多样化的菜单

Domino 有 9 种不同的菜肴,其中 5 道菜标记为热菜,2 道菜标记为超热菜,2 道菜标记为温和。

Verspucie 有 10 种不同的菜肴,其中 8 种被标记为超级热,一种被标记为温和,1 种被标记为热。

因为我想从一个完整的餐厅列表中找到正确的餐厅,所以我希望能够搜索这些餐厅的菜肴中出现最多的辣味。在 postgres 中,可以使用 mode 函数执行此操作,然后将此 mode 值加入到餐厅表中。 如果我想要一家主要提供超级热菜的餐厅,我的查询将如下所示:

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 餐厅,因为它是唯一一家将大部分菜肴标记为 Super Hot 的餐厅。但现在我想在 django ORM 语言中执行此操作,但在 django 中找不到 mode() 函数。

编辑: 我最后去了SQL查询

【问题讨论】:

  • 你只想找到哪家餐厅的菜名最多的是Super Hot?以您的示例为例,结果是 Verspucie,因为它有 8 个超级热?
  • 嗯,大多数菜场“辣”超级辣,但是是的

标签: python django database entity field


【解决方案1】:
    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

【讨论】:

  • 感谢您的回复,但没有办法知道辣“SH”是否是餐厅菜肴中出现最多的辣味。
  • 您必须定义“SH”的多少百分比是您想要的“最多”。你可以在执行我的查询后找到它:v。通过比较值numcount 和一家餐厅的所有菜肴
  • 很抱歉,但这不是我想要的数据库。我不知道百分比。
猜你喜欢
  • 2016-08-06
  • 2020-07-01
  • 2019-01-26
  • 1970-01-01
  • 2019-07-06
  • 2018-06-19
  • 2013-09-29
  • 2012-09-18
  • 2015-09-09
相关资源
最近更新 更多