Realmente estoy teniendo dificultades para comprender el concepto de los tipos de contenido de Django. Se siente muy hostil y, en última instancia, en contra de cómo Python tiende a hacer las cosas. Dicho esto, si voy a usar Django, entonces tengo que trabajar dentro de los límites del marco.
Así que vengo aquí preguntándome si alguien puede dar un ejemplo práctico del mundo real de cómo funciona un tipo de contenido y cómo lo implementaría. Casi todos los tutoriales (principalmente en blogs) que he revisado no hacen un gran trabajo realmente cubriendo el concepto. Parecen retomar donde quedó la documentación de Django (lo que parece no estar en ninguna parte).
Respuestas:
Entonces, ¿desea utilizar el marco de Tipos de contenido en su trabajo?
Comience por hacerse esta pregunta: "¿Es necesario que alguno de estos modelos esté relacionado de la misma manera con otros modelos y / o reutilizaré estas relaciones de manera imprevista más adelante?" La razón por la que hacemos esta pregunta es porque esto es lo que el marco de Tipos de contenido hace mejor: crea relaciones genéricas entre modelos. Bla, bla, vamos a sumergirnos en un código y ver a qué me refiero.
Bien, entonces tenemos una manera de crear teóricamente esta relación. Sin embargo, como programador de Python, su intelecto superior le dice que esto apesta y que puede hacerlo mejor. ¡Cinco altos!
¡Ingrese al marco de tipos de contenido!
Bueno, ahora vamos a echar un vistazo de cerca a nuestros modelos y modificarlos para que sean más "reutilizables" e intuitivos. Comencemos por deshacernos de las dos claves foráneas en nuestro
Comment
modelo y reemplazarlas con aGenericForeignKey
.¿Entonces qué pasó? Bueno, entramos y agregamos el código necesario para permitir una relación genérica con otros modelos. Observe cómo hay más que solo un
GenericForeignKey
, pero también unForeignKey
toContentType
y unPositiveIntegerField
para elobject_id
. Estos campos son para decirle a Django con qué tipo de objeto está relacionado y cuál es la identificación para ese objeto. En realidad, esto tiene sentido porque Django necesitará ambos para buscar estos objetos relacionados.Bueno, eso no es muy parecido a Python ... ¡es un poco feo!
Probablemente esté buscando un código hermético, impecable e intuitivo que enorgullezca a Guido van Rossum . Te entiendo Echemos un vistazo al
GenericRelation
campo para que podamos hacer una hermosa reverencia sobre esto.Bam! Solo así puede trabajar con los Comentarios para estos dos modelos. De hecho, sigamos adelante y hagámoslo en nuestro shell (escriba
python manage.py shell
desde el directorio de su proyecto Django).Es así de simple.
¿Cuáles son las otras implicaciones prácticas de estas relaciones "genéricas"?
Las claves foráneas genéricas permiten relaciones menos intrusivas entre varias aplicaciones. Por ejemplo, supongamos que sacamos el modelo de comentarios en su propia aplicación llamada
chatterly
. Ahora queremos crear otra aplicación llamadanoise_nimbus
donde las personas almacenan su música para compartirla con otros.¿Qué pasa si queremos agregar comentarios a esas canciones? Bueno, podemos dibujar una relación genérica:
Espero que les haya resultado útil, ya que me hubiera encantado haber encontrado algo que me mostró la aplicación
GenericForeignKey
y losGenericRelation
campos más realistas .¿Es esto demasiado bueno para ser verdad?
Como con cualquier cosa en la vida, hay pros y contras. Cada vez que agrega más código y más abstracción, los procesos subyacentes se vuelven más pesados y un poco más lentos. Agregar relaciones genéricas puede agregar un poco de amortiguador de rendimiento a pesar del hecho de que intentará almacenar en caché inteligente sus resultados. Con todo, todo se reduce a si la limpieza y la simplicidad superan los pequeños costos de rendimiento. Para mí, la respuesta es un millón de veces sí.
Hay más en el marco de Tipos de contenido de lo que he mostrado aquí. Hay un nivel completo de granularidad y un uso más detallado, pero para el individuo promedio, así es como lo usará 9 de cada 10 veces en mi opinión.
Relacionadores genéricos (?) ¡Cuidado!
Una advertencia bastante grande es que cuando utiliza un
GenericRelation
, si se elimina el modelo que tieneGenericRelation
aplicado (Picture
), todos losComment
objetos relacionados ( ) también se eliminarán. O al menos al momento de escribir esto.fuente
GenericRelation
inPost
yPicture
luego no necesito usarobject_id
, ¿content_type
ycontent_object
inComment
?Bien, la respuesta directa a su pregunta: (del código fuente de django) es: Análisis de tipos de medios según RFC 2616, sección 3.7.
¿Cuál es la forma de decir que lee / le permite modificar / pasa a lo largo del encabezado httpd 'Content-type' ?
Sin embargo, está pidiendo un ejemplo de uso más práctico. Tengo 2 sugerencias para ti:
1: examina este código
2: recuerde que django es python, y como tal ejerce el poder de la comunidad python. Hay 2 complementos RESTFul impresionantes para django. Entonces, si quieres ver qué tan profundo va todo el conejo, puedes echarle un vistazo.
Sugiero pasar por el tutorial django-rest-framework que abordará específicamente 'actuar sobre diferentes contenidos / tipos'. Nota: Es una práctica común usar el encabezado de tipo de contenido para 'versionar' las API relajantes .
fuente