Uso avanzado del ORM de Django


En un post anterior ya explique los peligros de utilizar mal el ORM de Django. Puedes acabar destruyendo el performance de tu aplicación haciendo cientos de consultas. Me gustaría extender un poco más el tema y hacer algunos ejemplo de usos más avanzados.

En este ejemplo tengo dos tablas. Tabla <Product> y tabla <ProductMeta>.

class Product(models.Model):
    image = models.ImageField(upload_to='product', blank=True)
    wholesale_price = models.DecimalField(max_digits=9, decimal_places=2, default=0)
    reference = models.CharField(max_length=220, blank=True)
    active = models.BooleanField(default=False)
    stock = models.IntegerField(default=0)

class ProductMeta(models.Model):
    product = models.ForeignKey(Product, related_name='product_meta', blank=True, null=True)
    name = models.CharField(max_length=220, blank=True)
    slug = models.CharField(max_length=220, blank=True)
    description = models.TextField(blank=True, null=True)
    price = models.DecimalField(max_digits=9, decimal_places=2, default=0)
    language = models.CharField(max_length=15, blank=True)

Una tabla guarda la información de producto general como el stock, la imagen, etc… Mientras que en la otra tabla se guardan las traducciones del producto.

El resultado que me gustaría conseguir es el siguiente:

{
    "image": "-",
    "wholesale_price": "-",
    "reference": "-",
    "active": "-",
    "stock": "-",
    "meta_info": {
    	"name": "-",
	"slug": "-",
	"description": "-",
	"price": "-",
	"language": "-",
    }
}

Para hacer esto de forma optima utilizaremos “Prefetch“.

prefetch = Prefetch('product_meta', queryset=ProductMeta.objects.filter(language="es-ES"), to_attr='meta_info')
product = Product.objects.prefetch_related(prefetch).get(id=product_id)
Etiquetas: , ,

You may also like

LEAVE A COMMENT