Django, выберите связанное, среднее, поле ManyToMany

Предположим, у меня есть клиенты в моей модели (модель «Клиент»), и предположим, что у каждого клиента есть корзина для покупок (модель «Корзина»). В каждой корзине много товаров (модель 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?


person thiag0ms    schedule 05.08.2016    source источник
comment
Ответ - не беспокоить. Просто используйте необработанный запрос. Нет причин, по которым вы не должны этого делать (за исключением того факта, что если вы повторяете набор запросов несколько раз, запрос будет выполняться каждый раз)   -  person e4c5    schedule 05.08.2016
comment
Но при этом могу ли я нормально использовать Paginator, точно так же, как если бы это был набор запросов?   -  person thiag0ms    schedule 06.08.2016
comment
вы правы, пагинаторы по умолчанию нельзя использовать с rawqueryset   -  person e4c5    schedule 06.08.2016


Ответы (1)