[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