[pyar] Consulta Django
nestor godoy
licomgodoy en gmail.com
Jue Jul 27 16:23:39 ART 2017
Sofi Denner, yo por lo que puedo visualizar cuando haces
[sales_queryset.filter(date__week=k).aggregate(sum=Sum('kg'))['sum'] for k
in weeks_list]
Estas haciendo X =len(weeks_list) llamadas ala base de datos. Debes reducir
ese numero de llamada, por lo tanto debes agrupar por semanas y luego
calcular la suma por los Kg.
from django.db.models.functions import Extract
from django.db.models import Count,Sum
sales_queryset = sales_queryset.annotate(dateweek=Extract('date','week')).\
values('dateweek').annotate(sum_week=Sum('kg'))
De estas formas de en una sola llamada de traes las 52 semanas del año.
Otra cosa que debes ver es que si el queryset no lo agrupa o filtra por año
y tiene una tabla con 3 años te van sumar las semanas de todos los años
El 27 de julio de 2017, 16:00, Sofi Denner <sofi.denner en gmail.com> escribió:
> Gracias a los cuatro por sus respuestas!!
> No solo pude solucionar mi problema, sino que además aprendí mucho :)
>
> Lo que no terminé de entender es lo del prefecht... Soy medio newbie en
> esto, y por ahí me falta más background. Pero puede ser que solo sirva para
> relaciones 'ManyToMany' o 'ManyToOne'?
>
> O capaz que yo estoy haciendo algo mal, por que probé haciendo:
> sales_queryset.prefecht_related('date__week')
>
> y después hice lo mismo de antes:
> [sales_queryset.filter(date__week=k).aggregate(sum=Sum('kg'))['sum'] for
> k in weeks_list]
>
> Y me siguió demorando un montón (35 segundos aprox, igual que antes de
> hacer ese prefecht).
>
> Hay algo que estoy haciendo mal?
>
> Igual pregunto de curiosa nomás, mi problema original ya lo pude resolver,
> pero esto me dejó intrigada.
>
> Un abrazo! Y gracias nuevamente.
>
>
>
>
> El jue., 27 de jul. de 2017 a la(s) 15:22, nestor godoy <
> licomgodoy en gmail.com> escribió:
>
>> Hola Sofi Denner por lo que pude ver debes leer sobre
>>
>> https://docs.djangoproject.com/en/1.11/ref/models/
>> database-functions/#extract
>>
>> luego hacer algo asi :
>>
>> sales_queryset = sales_queryset.annotate(dateweek=Extract('date',
>> 'week'))
>>
>> te dara tipo :
>>
>> “dateweek”: 1
>> “dateweek”: 1
>> “dateweek”: 2
>> “dateweek”: 25
>>
>> como se repiten debe agrupar y sumar
>>
>> sales_queryset.values('dateweek').annotate(sum_week=Sum('kg'))
>>
>>
>>
>> El 27 de julio de 2017, 12:29, Facundo Batista <facundobatista en gmail.com>
>> escribió:
>>
>>> 2017-07-27 9:49 GMT-03:00 Sofi Denner <sofi.denner en gmail.com>:
>>> > Buen día lista! Les hago una pregunta de Django, que no estoy pudiendo
>>> > resolver:
>>> > Existe alguna forma de hacer algo parecido a esto?:
>>> >
>>> > sales_queryset.values('date__week').annotate(sum_week=Sum('kg'))
>>> >
>>> > La idea es agrupar la suma de todos los kg vendidos por semana. La
>>> parte que
>>> > falla es la de ".values('date__week')". Colocando ".values('date')"
>>> > funciona, pero por supuesto, agrupa las ventas por día y no por semana.
>>> >
>>> > Hasta ahora la forma de "solucionarlo" que se me ocurrió es haciendo:
>>> >
>>> > [sales_queryset.filter(date__week=k).aggregate(sum=Sum('kg'))['sum']
>>> for k
>>> > in weeks_list]
>>> >
>>> > Pero esta forma es suuuuper ineficiente.
>>> >
>>> > Alguien me tira alguna idea de cómo resolverlo?
>>>
>>> ¿Por qué es super ineficiente? ¿Porque al iterar estás yendo mucho a la
>>> DB?
>>>
>>> Y si prefetcheas los atributos relacionados? de esta manera traería
>>> todo de un golpe, y ya
>>>
>>> https://docs.djangoproject.com/en/1.11/ref/models/
>>> querysets/#prefetch-related
>>>
>>> Saludos!
>>>
>>> --
>>> . Facundo
>>>
>>> Blog: http://www.taniquetil.com.ar/plog/
>>> PyAr: http://www.python.org/ar/
>>> Twitter: @facundobatista
>>> _______________________________________________
>>> Lista de Correo de PyAr - Python Argentina - pyar en python.org.ar
>>> Sitio web: http://www.python.org.ar/
>>>
>>> Para administrar la lista (o desuscribirse) entrar a
>>> http://listas.python.org.ar/listinfo/pyar
>>>
>>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
>>> Argentina - http://www.usla.org.ar
>>>
>>
>> _______________________________________________
>> Lista de Correo de PyAr - Python Argentina - pyar en python.org.ar
>> Sitio web: http://www.python.org.ar/
>>
>> Para administrar la lista (o desuscribirse) entrar a
>> http://listas.python.org.ar/listinfo/pyar
>>
>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
>> Argentina - http://www.usla.org.ar
>
>
> _______________________________________________
> Lista de Correo de PyAr - Python Argentina - pyar en python.org.ar
> Sitio web: http://www.python.org.ar/
>
> Para administrar la lista (o desuscribirse) entrar a
> http://listas.python.org.ar/listinfo/pyar
>
> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
> Argentina - http://www.usla.org.ar
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20170727/cdbf3ede/attachment-0001.html>
Más información sobre la lista de distribución pyar