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')