0

モデル (モデル Client) にクライアントがあり、各クライアントにショッピング カート (モデル Cart) があるとします。各カートには多くのアイテム (モデル CartItems) があり、最後に、各アイテムには 1 つの製品 (モデル Product) との関係があります。

さて、ここに私の問題があります。クライアントごとに、各カートのすべてのアイテムの合計に基づく、すべてのショッピング カートの平均を取得したいと考えています。そのため、以下で詳細を説明します。

次のような関係の方向を想像してみてください: 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 に答える