es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo agrupar datos iguales y mostrarlos en la plantilla.

Tengo una aplicación que muestra el historial de productos ordenados en un restaurante, y para obtener los datos del restaurante, tengo la siguiente vista:

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)

En la plantilla lo estoy mostrando de la siguiente manera:

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

             <br> 
    {% endfor %}
</div>

Pero haciéndolo de esta manera obtengo cada dato por separado, y me gustaría saber si hay alguna forma de agrupar los datos que tienen un campo con el mismo valor. El resultado que obtengo ahora es este, y me gustaría algo como esto.

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),
        ]
    )
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Puede utilizar el campo order en el modelo Item para agrupar los datos. Puede utilizar el método groupby en el QuerySet para agrupar los elementos por el campo order.

    def restaurant_orders(request):
    
        restaurante = obtener_restaurante(id_usuario=request.user.restaurant.user_id)
        
        productos = lista(restaurante.restaurante.values_list("id"))
    
        items = Item.objects.filter(product_id__in=productos).order_by('order_id').groupby('order')
    
        contexto = {'items': items}
    
        return render(request, 'pages/orders_restaurant.html', contexto)
    

    En la plantilla, puede recorrer los elementos items y acceder a los campos order y item_set.

    <div class="col-lg-7">
        <h2>Historial de pedidos</h2>
        {% for order, item_set in items %}
            <ul class="list-group list-group-flush"></ul>
            <li class="list-group-item bg-light">
            <h4>Pedido {{ order.order_id }}</h4>
            {% for item in item_set %}
                {{ item.quantity }} X {{ item.product }}
                <span class="float-right">R$ {{ item.price }}</span>
            {% endfor %}
                <li class="font-weight-bold list-group-item bg-light">Nombre del cliente
                    <span class="float-right">{{ order.name }}</span>
                </li>
            </li>
                 <br> 
        {% endfor %}
    </div>
    

Comments are closed.