[pyar] Python - Django - select_related
Jose Luis
joseluiszanotti en gmail.com
Dom Mayo 29 22:35:24 ART 2016
:/
El 29/05/16 a las 22:31, fisa escribió:
> My bad! Pensé que main_product era una instancia de ProductMain, pero
> mirando veo que no, es un dict que sale de esa query con values antes.
> Eso que te dije es para cuando lo que tengas sean instancias de los
> modelos, mi error :)
>
> Saludos!
>
> On Sun, May 29, 2016 at 10:16 PM Jose Luis <joseluiszanotti en gmail.com
> <mailto:joseluiszanotti en gmail.com>> wrote:
>
> Fisa, estuve intentando lo que decis de no usar el ID, pero me
> tira este error "TypeError: int() argument must be a string or a
> number, not 'dict'"
>
> en que parte decis q use
> Product.objects.values('id').get(product_main=main_product) ?
> dentro del loop?
>
> Abrazo
>
>
>
> El 29/05/16 a las 21:33, fisa escribió:
>> Dos detalles que noto:
>>
>> 1) No hace falta que uses los _id a mano para comparar, de hecho
>> no es recomendable que lo hagas. Podés hacer directamente esto:
>> Product.objects.values('id').get(product_main=main_product)
>> 2) Veo que Por cada ProductMain hay un solo Product, y que no
>> todos los Product tienen ProductMain, pero siempre por cada
>> ProductMain asumís que existe ese único Product apuntando a él.
>> Qué es lo que te llevó a poner la foreign key en Product y no al
>> revés? me suena a que si todo ProductMain tiene un único Product
>> asociado, y no a la inversa, entonces es una foreign key que va
>> en ProductMain, no? Hacerlo de esa forma además te
>> ahorraría/simplificaría un poco las queries (podrías hacer
>> directamente
>> ProductMain.filter(...).select_related(relacion_a_product) y te
>> traerías todos los ProductMain con sus Product en una sola query
>> re simple).
>>
>> Saludos!
>>
>>
>>
>> On Sun, May 29, 2016 at 9:13 PM Jose Luis
>> <joseluiszanotti en gmail.com <mailto:joseluiszanotti en gmail.com>> wrote:
>>
>> Excelente voy a probar en un rato algo parecido a eso.
>>
>> Lo que necesito es obtener es un dict con TODOS los
>> ProductMain + el ultimo valor de ProductVariation de cada
>> ProductMain . Uno de los problemas es que tengo tres tablas.
>>
>> para obtener el ProductVariation necesito consultar el ID en
>> Product, lindo lio hice con las tablas me parece :D
>>
>>
>>
>>
>>
>> El 29/05/16 a las 20:41, Alessandro Odetti escribió:
>>> Hola José Luis,
>>>
>>> si lo que querés efectivamente es obtener los
>>> ProductVariation de una categoria de ProductMain, yo lo
>>> haría de la siguente forma utlilizando los lookups de
>>> Django, quizás alguno te pueda dar una mejor opción:
>>>
>>> category_id = request.GET['category_id']
>>> ProductVariation.objects.values('stock',
>>> 'price').filter(product__product_main__main_category_id=category_id)
>>>
>>> eso te va a dar todos los ProductVariation. Si luego queres
>>> obtener el ultimo de cada producto deberias hacer un
>>> distinct o algo por el estilo...
>>>
>>> Espero te sirva. Saludos!
>>>
>>>
>>>
>>> El 29 de mayo de 2016, 19:08, Jose Luis
>>> <joseluiszanotti en gmail.com
>>> <mailto:joseluiszanotti en gmail.com>> escribió:
>>>
>>> Hola estimados, estoy jugando desde hace una semana con
>>> Django, y estoy migrando una app q tenía en flask a django.
>>>
>>> Mientras voy escribiendo el nuevo código veo la cantidad
>>> de cosas "fuleras" que he escrito hace solo un par de
>>> meses, así que aprovecho para optimizar un poco el
>>> código y los tiempos de ejecución.
>>>
>>> Entre las partes de optimización, estoy viendo de o
>>> modificar la estructura de los modelos/tablas o que
>>> alguien me oriente a usar select_related o algun tipo de
>>> join. El problema reside en esta parte del código.
>>>
>>> MODELOS
>>> class ProductMain(models.Model):
>>> name = models.CharField(max_length=255)
>>> model = models.CharField(max_length=30)
>>> description = models.TextField()
>>> specs = models.TextField()
>>> update_by = models.DateField(auto_now_add=True)
>>> status = models.BooleanField()
>>> image = models.BooleanField()
>>> main_category =
>>> models.ForeignKey('categories.MainCategory')
>>>
>>> class Product(models.Model):
>>> code = models.CharField(max_length=30)
>>> name = models.CharField(max_length=255)
>>> model = models.CharField(max_length=25)
>>> description = models.TextField(null=True)
>>> warranty = models.IntegerField()
>>> tax = models.IntegerField()
>>> sales = models.IntegerField()
>>> value = models.DecimalField(max_digits=9,
>>> decimal_places=2)
>>> update_by = models.DateField(auto_now_add=True)
>>> status = models.BooleanField(default=True)
>>> product_related = models.ForeignKey(ProductRelated,
>>> default=None)
>>> product_category =
>>> models.ForeignKey(ProductCategory, default=None)
>>> manufacturer =
>>> models.ForeignKey('manufacturers.Manufacturer',
>>> default=None)
>>> supplier = models.ForeignKey('suppliers.Supplier',
>>> default=None)
>>> product_main = models.ForeignKey(ProductMain,
>>> default=None)
>>>
>>>
>>> class ProductVariation(models.Model):
>>> price = models.DecimalField(max_digits=9,
>>> decimal_places=2)
>>> stock = models.IntegerField()
>>> incoming = models.IntegerField()
>>> update_by = models.DateField(auto_now_add=True)
>>> # status = models.BooleanField(default=True)
>>> product = models.ForeignKey(Product)
>>>
>>>
>>>
>>> class GetProducts(View):
>>> def get(self, request):
>>> return JsonResponse(self.get_context_data(self,
>>> request), safe=False)
>>>
>>> @staticmethod
>>> def get_context_data(self, request):
>>> product_info = []
>>> category_id = request.GET['category_id']
>>> main_products =
>>> list(ProductMain.objects.values().filter(main_category_id=category_id))
>>> # test_products =
>>> list(ProductMain.objects.select_related(Product).filter(main_category_id=category_id))
>>> # print test_products
>>> # quit()
>>> for main_product in main_products:
>>> product =
>>> Product.objects.values('id').get(product_main_id=main_product['id'])
>>> stock_price =
>>> ProductVariation.objects.values('stock',
>>> 'price').filter(product_id=product['id']).last()
>>> product_info.append(dict(main_product, **stock_price))
>>> return product_info
>>>
>>> como verán hace 3 query por separados para obtener los
>>> datos stock y price que estan en otra tabla :/
>>>
>>> Pueden ver la posibilidad de darme una mano (para hacer
>>> el query en una sola linea o para modificar/estructurar
>>> los modelos de otra forma), estoy medio perdido.
>>>
>>> Gracias de antemano!
>>> Sam
>>>
>>> _______________________________________________
>>> pyar mailing list pyar en python.org.ar
>>> <mailto:pyar en python.org.ar>
>>> http://listas.python.org.ar/listinfo/pyar
>>>
>>> PyAr - Python Argentina - Sitio web:
>>> http://www.python.org.ar/
>>>
>>> La lista de PyAr esta Hosteada en USLA - Usuarios de
>>> Software Libre de Argentina - http://www.usla.org.ar
>>>
>>>
>>>
>>>
>>> --
>>> *- Alessandro Odetti -*
>>>
>>>
>>> _______________________________________________
>>> pyar mailing listpyar en python.org.ar <mailto:pyar en python.org.ar>
>>> http://listas.python.org.ar/listinfo/pyar
>>>
>>> PyAr - Python Argentina - Sitio web:http://www.python.org.ar/
>>>
>>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de Argentina -http://www.usla.org.ar
>>
>> _______________________________________________
>> pyar mailing list pyar en python.org.ar <mailto:pyar en python.org.ar>
>> http://listas.python.org.ar/listinfo/pyar
>>
>> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>>
>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software
>> Libre de Argentina - http://www.usla.org.ar
>>
>> --
>> --
>> fisa - Juan Pedro Fisanotti
>>
>>
>> _______________________________________________
>> pyar mailing listpyar en python.org.ar <mailto:pyar en python.org.ar>
>> http://listas.python.org.ar/listinfo/pyar
>>
>> PyAr - Python Argentina - Sitio web:http://www.python.org.ar/
>>
>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de Argentina -http://www.usla.org.ar
> _______________________________________________
> pyar mailing list pyar en python.org.ar <mailto:pyar en python.org.ar>
> http://listas.python.org.ar/listinfo/pyar
>
> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>
> La lista de PyAr esta Hosteada en USLA - Usuarios de Software
> Libre de Argentina - http://www.usla.org.ar
>
> --
> --
> fisa - Juan Pedro Fisanotti
>
>
> _______________________________________________
> pyar mailing list pyar en python.org.ar
> http://listas.python.org.ar/listinfo/pyar
>
> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>
> 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/20160529/eea1aa82/attachment-0001.html>
Más información sobre la lista de distribución pyar