[pyar] Python - Django - select_related

Jose Luis joseluiszanotti en gmail.com
Dom Mayo 29 22:16:25 ART 2016


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 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/df42ee30/attachment-0001.html>


Más información sobre la lista de distribución pyar