私のモデル(クライアントモデル)にクライアントがあり、各クライアントにショッピングカート(モデルカート)があるとします。各カートには多くのアイテム(モデル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'))
お知らせ:
答えはわかりません。生のクエリを使用するだけです。なぜなら、あなたが(クエリーセットを繰り返し実行すると、毎回クエリが実行されるという事実を除いて) – e4c5
ですが、これはクエリセットだったのと同じように、通常はPaginatorを通常使うことができますか? – user3707567
デフォルト設定のページ設定は、rawquerysetで使用することはできません – e4c5