Django: relaciones polimórficas

Django tiene varias formas de relacionar modelos entre sí:
  • ForeingKey
  • ManyToManyField
  • OneToManyField
Una de las limitaciones de este sistema es que esta relación es estática, solo permite la relación a un tipo de modelo. No permite relaciones polimórficas. Si conoces PHP y el framework Laravel, sabrás a que me refiero.

Sin embargo, Django incluye una aplicación llamada "contenttypes" que además de permirte seguir todos los modelos instalados en tu proyecto y un interfaz para trabajar con ellos, permite generar estas relaciones polimórficas llamadas "relaciones genéricas".

Ejemplo de relación genérica:
Este modelo Comment está referenciando al Post en el que se incluye. ForeingKey es la relación adecuada ya que un comentario sólo pertenece a un post.

Pero si quisieramos utilizar este modelo para hacer comentarios sobre otros elemntos que no fueran posts, tendríamos un problema, ya que está asociado directamente a un post. Solución: relaciones genéricas a través de contenttypes.
Guardar nuevos valores no tiene ninguna mágia, igual que con cualquier otro modelo.
Y ahora que tenemos los objetos creados, vamos a ver como recuperarlos.

Revertir Relaciones Genericas

Uno de los problemas de las relaciones genéricas es que no podemos hacer queries sobre ellas, si intentáramos hacer algo como esto, daría una excepción.
Los filtros tienen que aplicarse sobre los dos campos: content_type y object_id.
Esto es bastante tedioso, pero al menos sabemos que funcionara para todos los casos. Django nos proporciona el campo GenericRelation para acceder a las relaciones polimórficas de manera más sencilla. Desde este campo podemos añadir, modificar, borrar y consultar sin problema.

Comentarios

Entradas populares de este blog

Envío de checkboxes o selector multiple por AJAX con jQuery

Conceptos básicos de la POO

Patrones de Diseño Creacionales