Django,选择相关,平均,ManyToMany字段

时间:2016-08-05 02:43:05

标签: django django-models django-select-related

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

现在,这是我的问题。我希望为每个客户提供所有购物车的平均值,该购物车的总和基于每个购物车的所有商品。因此,我将尝试向您展示以下更多详细信息。

尝试想象这样的关系的方向: 客户端 - > Cart-> CartItems< - 产品

每种型号的简化说明:

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;

在纯SQL中,我找到了解决方案,并且会像这样的查询:

{{1}}

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

1 个答案:

答案 0 :(得分:0)

你可以这样做:

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

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

进一步阅读:Aggregations in Django