widgets tutorial tipos formularios form fields example campos avanzados django tagging database-design django-tagging

tutorial - ''Etiquetas de máquina'' que hacen referencia a instancias modelo en Django



formularios avanzados django (1)

No creo que el uso del etiquetado sea apropiado para representar relaciones. Por supuesto, todo depende del tipo de consultas que desee realizar. Para las consultas de navegación regulares, se deben usar las relaciones regulares n: m. El etiquetado debe usarse cuando la estructura de información ahora se conoce por adelantado.

Problema de ejemplo

Digamos que tienes modelos de Publication , Photo , Event y Person ; podrían relacionarse entre sí de diferentes maneras. Particularmente, las publicaciones pueden tener 1) algunas ilustraciones (fotos relacionadas) y 2) algunas personas mencionadas. Los eventos pueden tener 3) fotos y 4) personas relacionadas también. Además, 5) eventos podrían mencionarse en publicaciones.

No es necesario asociar datos adicionales con las relaciones, a excepción de las ilustraciones: necesitan un campo de posición para la clasificación. Entonces, en ese caso (n. ° 1), está bien ir con el modelo intermedio, como la Illustration referencia a la fotografía y la publicación, y especificando un campo de posición.

Pero con los casos 2 o 4 se vuelve complicado.

Tiene sentido especificar, por ejemplo, un ReferencedPerson que pueda apuntar a un objeto de cualquier tipo (a través de una clave externa genérica), por lo que podría usarse tanto para publicaciones como para eventos. Por otro lado, puede especificar ReferencedEvent , que podría usarse en los casos 5 y 3, pero también en el caso 4, porque realmente no puede decir que es un evento que hace referencia a una persona y no al revés.

Por lo tanto, en un momento dado se vuelve lo suficientemente desordenado como para comenzar a pensar en simplemente especificar un modelo de ReferencedObject con dos claves externas genéricas. Y esto no es bueno, esto es para lo que son las etiquetas, y si las etiquetas pudieran representar otras instancias de modelos, sería genial.

La idea

Las etiquetas de máquina son etiquetas que pueden contener espacios de nombres y / o valores. Se ven como namespace:tag=value (con espacios de nombres y partes de valores opcionales).

Las etiquetas de máquina se pueden usar no solo para contener datos adicionales, sino también para representar relaciones entre objetos. Un ejemplo aproximado sería Flickr, donde puedes etiquetar una foto con, por ejemplo, upcoming:event=81334 y se mostrará automáticamente como un enlace a Próximos.

Posibles variantes de implementación

Hay una rama de django-tagging aplicación django-tagging . Es bastante genérico y las etiquetas no se consideran como objetos de referencia. Pienso en escribir una aplicación que proporcione funciones de ayuda y una etiqueta o filtro de plantilla que reemplace la etiqueta de máquina "especial", por ejemplo, con el nombre legible por el humano al que se hace referencia.

La pregunta

(Perdón por más de uno.) ¿Tiene sentido crear relaciones entre modelos como ese, con etiquetas de máquina? Y si lo hace, ¿cuál sería la mejor manera de implementar eso con Django? ¿Cuáles son los casos en que es mejor usar modelos intermedios? ¿Estoy resolviendo el problema equivocado aquí?