[pyar] Python - Django - select_related

fisa fisadev en gmail.com
Dom Mayo 29 21:33:13 ART 2016


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> 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>
> 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
>> http://listas.python.org.ar/listinfo/pyar
>>
>> PyAr - Python Argentina - Sitio web: <http://www.python.org.ar/>
>> 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.arhttp://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
> 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
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20160530/865cfeaf/attachment.html>


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