Как сгруппировать одинаковые данные и показать их в шаблоне
У меня есть приложение, которое показывает историю продуктов, заказанных в ресторане, и чтобы получить данные о ресторане, у меня есть следующее представление:
def restaurant_orders(request):
restaurant = get_restaurant(request.user.restaurant.user_id)
products = list(restaurant.restaurante.values_list("id"))
items = Item.objects.filter(product_id__in=products).order_by('order_id')
context = {'items': items}
return render(request, 'pages/orders_restaurant.html', context)
В шаблоне я отображаю следующим образом:
<div class="col-lg-7">
<h2>Histórico de Pedidos</h2>
{% for value in items %}
<ul class="list-group list-group-flush"></ul>
<li class="list-group-item bg-light">
<h4>Order {{ value.order_id }}</h4>
{{ value.quantity }} X {{ value.product }}
<span class="float-right">R$ {{ value.price }}</span>
<li class="font-weight-bold list-group-item bg-light">Client Name
<span class="float-right">{{ value.order.name }}</span>
</li>
</li>
<br>
{% endfor %}
</div>
но, делая это таким образом, я получаю каждые данные отдельно, и я хотел бы знать, есть ли способ сгруппировать данные, которые имеют поле с одинаковым значением. Результат, который я получаю сейчас - this, а я бы хотел что-то вроде this.
model.py
class Item(models.Model):
order = models.ForeignKey(Order, related_name="items", on_delete=models.CASCADE)
product = models.ForeignKey(Product, related_name="order_items", on_delete=models.CASCADE)
price = models.DecimalField(max_digits=5, decimal_places=2)
quantity = models.PositiveIntegerField(
validators= [
MinValueValidator(1),
MaxValueValidator(20),
]
)
Вам нужно выполнить цикл по запросу модели Order
.
Вы можете отфильтровать его через свойство related name в модели Item
.
orders = Order.objects.filter(items__product_id__in=products)
Затем, в вашем шаблоне, вы можете перебирать заказы и товары в каждом из них:
<ul> {# apply your markup... #}
{% for order in orders %}
<li>
{{ order }}
<ul>
{% for item in order.items.all %}
<li>{{ item.product }} {# ... #}
{% endfor %}
</ul>
</li>
{% endfor %}
</ul>