2016-08-05 3 views
0

Предположим, у меня есть клиенты в моей модели (модель Client), и каждый клиент имеет корзину покупок (модель Cart). Каждая тележка имеет много элементов (модель CartItems), а затем для завершения, каждый элемент имеет отношение к одному продукту (модель продукта).Django, выберите родственный, средний, многоголовое поле

Теперь вот моя проблема. Я хочу иметь среднее количество всех тележек для покупок, которые основаны на сумме всех позиций каждой корзины для каждого клиента. Поэтому я попытаюсь продемонстрировать вам более подробно ниже.

Попробуйте представить себе направления отношений, как это: Client-> cart-> CartItems < -Продукт

упрощенное описание каждой модели:

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; 

Каждый имеет ни малейшего представления о том, как преобразовать этот запрос Джанго» модели модели?

+0

Ответ не беспокоить. Просто используйте необработанный запрос. Нет причин, по которым вы не должны (за исключением того факта, что если вы повторяете запрос несколько раз, запрос будет выполняться каждый раз) – e4c5

+0

Но если это так, я могу использовать Paginator нормально, точно так же, как если бы это был запрос? – user3707567

+0

Вы правы, вы не можете использовать стандартные paginators с rawqueryset – e4c5

ответ

0

Вы sould сделать что-то вроде:

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

Обратите внимание, что аннотации не возвращает QuerySet, вы должны возвращать значения.

Дальнейшее чтение: Aggregations in Django

+0

Client.objects.select_related(). Order_by (order_by) .annotate (total = Sum (F ('cadcp__cpi__product__value') * F ('cadcp__cpi__quantity'), output_field = models .DecimalField())). Extra (select = {'n_cart': 'COUNT (DISTINCT 'cart'.'id')'}). С помощью этого кода я мог бы получить общую цену каждой корзины покупок и количество клиентской корзины покупок, поэтому я могу делать total/n_cart и получать среднее значение, но таким образом я не могу сортировать по средним значениям. Любая идея, как это решить? Спасибо за ответ, это очень помогло. – user3707567