[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