Djnago. Получить количество Product в OrderItem по периоду даты

Всем доброго дня!
Столкнулся с банальной проблемой, и, возможно не знанием.
Задача:
Получить количество товаров по имени заказанных в определенный период.
Что сделано:
models.py

class OrderItem(models.Model):
CHOICES = (
    ('-', '------'),
    ('xs', 'XS'),
    ('xs/s', 'XS/S'),
    ('s', 'S'),
    ('s/m', 'S/M'),
    ('m', 'M'),
    ('m/l', 'M/L'),
    ('l/xl', 'L/XL')
)
order = models.ForeignKey(Order, on_delete=models.CASCADE)
product = models.ForeignKey(Product, on_delete=models.DO_NOTHING)
product_size = models.CharField(max_length=250, choices=CHOICES, default='xs', verbose_name='Размер')
parameters = models.TextField(verbose_name='Дополнительные параметры', blank=True)
product_color = models.CharField(max_length=250, verbose_name='Цвет')
product_quantity = models.PositiveIntegerField(verbose_name='Количество', default=1)

def __str__(self):
    return self.product.product_name

views.py

class TopOrderItemView(ListView):
template_name = 'reports/top_product.html'
model = OrderItem

def get_context_data(self, **kwargs):
    context = super(TopOrderItemView, self).get_context_data(**kwargs)
    top_sellers_ = Product.objects.annotate(count=Count('orderitem')).order_by('-count')
    if self.request.GET.get('date_since'):
        since_date = self.request.GET.get('date_since')
        to_date = self.request.GET.get('date_to')
        top_sellers_ = top_sellers_.filter(orderitem__order__order_create__gte=since_date,
                                           orderitem__order__order_create__lte=to_date)

    context['orderitem_list'] = top_sellers_
    return context

tempalte.html

<form action="", method="get">
                                {% csrf_token %}
                                <input type="date", name="date_since", min="2018-01-01" required="true">
                                <input type="date", name="date_to" required="true">
                                <input type="submit", value="Filter">
                            </form>
                        </div>
                        <!-- /.card-header -->
                        <div class="card-body">
                            <table id="example1" class="table table-bordered table-striped">
                                <thead>
                                <tr>
                                    <th>Товар</th>
                                    <th>Данные</th>
                                </tr>
                                </thead>
                                <tbody>
                                {% for product in orderitem_list %}
                                    <tr>
                                        <td>{{ product.product_name }}</td>
                                        <td>{{ product.orderitem_set.count }}</td>

                                    </tr>
                                {% endfor %}

                                </tbody>

Сами товары фильтрует хорошо по периоду дат, но выдает количество товаров в orderitem всегда все что есть в БД.
Какая нужна помощь:
Мне нужно иметь количество товара в заказах именно только за период дат.
Буду очень благодарен за помощь! Спасибо!


Ответы (1 шт):

Автор решения: Za Ars
    top_sellers_ = Product.objects.annotate(count=Count('orderitem')).order_by('-count')
    if self.request.GET.get('date_since'):
        since_date = self.request.GET.get('date_since')
        to_date = self.request.GET.get('date_to')
        top_sellers_ = top_sellers_.filter(orderitem__order__order_create__gte=since_date,
                                           orderitem__order__order_create__lte=to_date)

Перепишите код так, чтобы сначала была фильтрация по периоду, а уже потом был подсчет. Тут важен порядок

Примерно так


qs = Product.objects.all()

if self.request.GET.get('date_since'):
    since_date = self.request.GET.get('date_since')
    to_date = self.request.GET.get('date_to')
    qs = qs.filter(orderitem__order__order_create__gte=since_date, orderitem__order__order_create__lte=to_date)

top_sellers_ = qs.objects.annotate(count=Count('orderitem')).order_by('-count')
→ Ссылка