[pyar] Consulta Django
Sofi Denner
sofi.denner en gmail.com
Jue Jul 27 17:08:35 ART 2017
Si, esa parte ya la habia entendido. Y como podés ver, también, en el mail
anterior: mi problema ya esta solucionado :)
Mi nueva pregunta era solo de curiosidad para entender mejor como funciona
el prefecht.
Gracias igual por tu tiempo.
Un abrazo!
On Thu, Jul 27, 2017, 16:23 nestor godoy <licomgodoy en gmail.com> wrote:
> 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
>>
>
> _______________________________________________
> 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/8df01caa/attachment.html>
Más información sobre la lista de distribución pyar