【问题标题】:Django Query, find most common value for field on a many to many relationDjango Query,在多对多关系中查找字段的最常见值
【发布时间】:2020-10-28 18:10:11
【问题描述】:

鉴于这些模型(餐厅有很多比萨,而比萨有很多浇头

class Restraunt(Model)

class Topping(Model):
  name = Charfield()

class Pizza(Model):
  in_resteraunt = ForeignKey(Resteraunt) 
  toppings = ManyToMany(topping, related_name='on_pizza')

我试图弄清楚如何:给定一家餐厅,在所有比萨饼中,最常见的浇头是什么?

我想出的一件事是这样的(其中 R = 餐厅)

Topping.objects.filter(on_pizza__restaurant=R).annotate(the_count=Count('on_pizza')).order_by('-the_count')[0]

这里的问题是我不确定 on_pizza 是否对 Restaurant 对象是唯一的,基本上一个浇头对象可以在多个餐厅的披萨上,我需要它是唯一的。 这里我从 Topping 开始,有没有一种方法可以从披萨查询集开始?

我研究了子查询表达式,但不知道如何实现

【问题讨论】:

  • 好吧,它只会考虑该餐厅的Toppings,并过滤比萨饼。所以是的,这会起作用。

标签: python mysql django database


【解决方案1】:

这里的问题是我不确定on_pizza 是否是Restaurant 对象所独有的,基本上一个浇头对象可以在多个餐厅的披萨上,我需要它是唯一的。

查询正确。您过滤餐厅,这意味着在Count 中,它只会计算用于餐厅的Pizzas R。所以这确实会计算出餐厅R 制作的比萨饼最常见的配料。

查询将如下所示:

SELECT topping.*, COUNT(pizza.pk)
FROM topping
LEFT OUTER JOIN pizza_toppings ON pizza_toppings.topping_id = topping.id
LEFT OUTER JOIN pizza ON pizza.id = pizza_toppings.pizza_id
WHERE pizza.restaurant_id = id_of_r
GROUP BY topping.pk
ORDER BY COUNT(pizza.pk)
LIMIT 1

【讨论】:

    猜你喜欢
    • 2018-01-30
    • 1970-01-01
    • 2023-03-06
    • 2021-01-06
    • 1970-01-01
    • 2021-11-05
    • 2012-12-01
    • 2020-07-01
    • 2012-03-25
    相关资源
    最近更新 更多