0

假设我的模型中有客户(模型客户端),并假设每个客户都有一个购物车(模型车)。每个购物车有许多项目(模型 CartItems),然后完成,每个项目与一个产品(模型产品)有关系。

现在,我的问题来了。我想要每个客户的所有购物车的平均值,它基于每个购物车的所有项目的总和。因此,我将尝试在下面向您展示更多详细信息。

试着想象这样的关系方向:Client->Cart->CartItems<-Product

各型号简述:

Client (
  id #pk
)

Cart (
  id #pk
  client_id #fk that references to Client.id
)

CartItems (
  id #pk
  cart_id #fk that references to Cart.id
  product #fk that references to Product.id
)

ProductId (
  id #pk
  value # The price of the product
)

在纯 SQL 中,我找到了解决方案,类似于以下查询:

SELECT * FROM Client
INNER JOIN Cart ON Client.id = Cart.client_id
INNER JOIN 
(SELECT AVG(c.total) AS average, cart_id FROM
    (SELECT SUM(Product.price) AS total, CartItems.cart_id AS cart_id
    FROM CartItems
    INNER JOIN Product ON CartItems.product = Product.id
    GROUP BY CartItems.cart_id) AS c GROUP BY c.cart_id) AS d
ON d.cart_id = Cart.id;

任何人都知道如何将此查询转换为 Django 模型的模式?

4

2 回答 2

0

你应该做这样的事情:

Cart.objects.values('client_id').annotate(cant=Sum('cart_id__product__value')).aggregate(Avg('cant'))

请注意,注释不返回查询集,您应该返回值。

进一步阅读:Django 中的聚合

于 2016-08-05T19:47:37.277 回答
0

我的答案来得很晚,但我在寻找类似问题的解决方案时遇到了这个问题。

在我的例子中,我在 Cart 和 CartItems 之间有一个 ManyToManyField 关系,这使得它相当简单。

模型现在看起来像这样

Cart (
  id #pk
  client_id #fk that references to Client.id
  items #manytomany relationship to CartItems
)

CartItems (
  id #pk
  product #fk that references to Product.id
)

要获得每个购物车的平均值,查询将如下所示

Cart.objects.annotate(carts_avg=Avg('items__product__value'))
于 2022-01-03T14:07:11.283 回答