2016-08-05 10 views
0

私のモデル(クライアントモデル)にクライアントがあり、各クライアントにショッピングカート(モデルカート)があるとします。各カートには多くのアイテム(モデルCartItems)があり、終了するにはそれぞれのアイテムが1つの製品(モデル製品)との関係を持っています。Django、関連、平均、ManyToManyフィールドを選択

ここで、私の問題になります。私はすべてのショッピングカートの平均を持ちたいと思っています。これは各カートの全アイテムの合計に基づいています。ですから、私はあなたに以下の詳細を説明しようとします。

このような関係の方向性を想像してみてください:各モデルの クライアント - > Cart-> CartItems < - 製品

簡体説明:私が見つけた、純粋なSQLで

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 
) 

このクエリのようなものになります:

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 'に変換する方法については、モデルのパターン?注釈は、あなたが値を返す必要があるクエリセットを返さないことを

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

お知らせ:

+0

答えはわかりません。生のクエリを使用するだけです。なぜなら、あなたが(クエリーセットを繰り返し実行すると、毎回クエリが実行されるという事実を除いて) – e4c5

+0

ですが、これはクエリセットだったのと同じように、通常はPaginatorを通常使うことができますか? – user3707567

+0

デフォルト設定のページ設定は、rawquerysetで使用することはできません – e4c5

答えて

0

あなたのような何かをsould。

続きを読む:Aggregations in Django

+0

Client.objects.select_related()。order_by(order_by).annotate(合計=合計(F( 'cadcp__cpi__product_value')* F( 'cadcp__cpi__quantity')、output_field = models余分な(select = {'n_cart': 'COUNT(DISTINCT 'cart'.'id')'})。このコードでは、各ショッピングカートの価格の合計とショッピングカートの数をクライアントで取得できるので、合計/ n_cartを実行して平均を得ることができますが、平均でソートすることはできません。どのようにこれを解決するための任意のアイデア? お返事ありがとうございました。 – user3707567

関連する問題