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 usar la combinación de annotate y aggregate sum en Django ORM. Para usar la combinación de annotate y aggregate sum en Django ORM, se pueden seguir los siguientes pasos: 1. Importar los módulos necesarios de Django: “`python from django.db.models import Sum from django.db.models import F “` 2. Definir el modelo sobre el cual se realizará la operación de agregación: “`python class ModeloEjemplo(models.Model): cantidad = models.IntegerField() “` 3. Realizar la consulta utilizando annotate y aggregate sum: “`python resultado = ModeloEjemplo.objects.aggregate(total=Sum(‘cantidad’)) “` 4. La variable “resultado” ahora contendrá el valor total de la suma de la columna “cantidad” en el modelo “ModeloEjemplo”. Adicionalmente, se puede utilizar la función F para realizar una operación de agregación en conjunto con annotate. Por ejemplo, si se desea obtener la suma de la columna “cantidad” junto con otra columna “otra_cantidad”, se puede utilizar el siguiente código: “`python resultado = ModeloEjemplo.objects.annotate(total_sum=F(‘cantidad’) + F(‘otra_cantidad’)).aggregate(total=Sum(‘total_sum’)) “` Con estos pasos, se puede utilizar la combinación de annotate y aggregate sum para realizar operaciones de agregación en Django ORM de manera eficiente.

de la tabla de abajo, necesito que la salida sea:

[(Apple,21.0), (Orange,12.0) ,(Grapes,15.0)]

básicamente las frutas agrupadas con la suma de su costo

fecha en (dd/mm/yyyy)

Tabla de frutas:
fecha artículo precio
01/01/2021 Apple 5.0
01/01/2021 Orange 2.0
01/01/2021 Grapes 3.0
01/02/2021 Apple 7.0
01/02/2021 Orange 4.0
01/02/2021 Grapes 5.0
01/03/2021 Apple 9.0
01/03/2021 Orange 6.0
01/03/2021 Grapes 7.0
………..
….

models.py

class Fruits(models.Model):
    item = models.CharField(max_length=32)
    date = models.DateField()
    price = models.FloatField()

Intenté el siguiente código pero no está funcionando como se esperaba

fruit_prices = Fruits.objects.filter(date__gte=quarter_start_date,date__lte=quarter_end_date)
               .aggregate(Sum('price')).annotate('item').values('item','price').distinct()
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para obtener el resultado deseado, necesitamos agrupar las frutas por nombre y sumar sus precios. Podemos hacer esto utilizando los métodos values() y annotate() de los conjuntos de consultas de Django. Aquí está el código que debería funcionar:

    from django.db.models import Sum
    from datetime import datetime
    
    quarter_start_date = datetime(2021, 1, 1)
    quarter_end_date = datetime(2021, 3, 31)
    
    fruit_prices = (
        Fruits.objects
        .filter(date__gte=quarter_start_date, date__lte=quarter_end_date)
        .values('item')
        .annotate(total_price=Sum('price'))
        .values_list('item', 'total_price')
    )
    
    print(fruit_prices)
    

    Este código primero filtra el conjunto de consultas Fruits para incluir solo los elementos con fechas en el primer trimestre de 2021. Luego agrupa los elementos por su nombre (item) y usa el método annotate() para agregar un cálculo de la suma de sus campos de price. Finalmente, extrae solo los campos item y total_price del conjunto de consultas y convierte el resultado en una lista de tuplas, como se solicita.

    El resultado debería ser:

    [('Manzana', 21.0), ('Naranja', 12.0), ('Uvas', 15.0)]
    

Comments are closed.