[pyar] Python - Django - select_related

Jose Luis joseluiszanotti en gmail.com
Dom Mayo 29 21:13:47 ART 2016


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


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