Как сгруппировать одинаковые данные и показать их в шаблоне

У меня есть приложение, которое показывает историю продуктов, заказанных в ресторане, и чтобы получить данные о ресторане, у меня есть следующее представление:

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>

Вернуться на верх