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()
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()
yannotate()
de los conjuntos de consultas de Django. Aquí está el código que debería funcionar: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étodoannotate()
para agregar un cálculo de la suma de sus campos deprice
. Finalmente, extrae solo los campositem
ytotal_price
del conjunto de consultas y convierte el resultado en una lista de tuplas, como se solicita.El resultado debería ser: