J'ai vraiment du mal à saisir le concept des types de contenu de Django. Cela semble très hackish et, en fin de compte, contre la façon dont Python a tendance à faire les choses. Cela étant dit, si je veux utiliser Django, je dois travailler dans les limites du framework.
Je viens donc ici en me demandant si quelqu'un peut donner un exemple concret du fonctionnement d'un type de contenu et de sa mise en œuvre. Presque tous les tutoriels (principalement sur les blogs) que j'ai examinés ne font pas un excellent travail couvrant vraiment le concept. Ils semblent reprendre là où la documentation Django s'est arrêtée (ce qui ne semble nulle part).
Réponses:
Vous souhaitez donc utiliser le framework Types de contenu sur votre travail?
Commencez par vous poser cette question: "Est-ce que l'un de ces modèles doit être lié de la même manière à d'autres modèles et / ou vais-je réutiliser ces relations de manière imprévue plus tard?" La raison pour laquelle nous posons cette question est que c'est ce que le cadre des types de contenu fait le mieux: il crée des relations génériques entre les modèles. Bla bla, plongeons dans un peu de code et voyons ce que je veux dire.
D'accord, nous avons donc un moyen de créer théoriquement cette relation. Cependant, en tant que programmeur Python, votre intellect supérieur vous dit que c'est nul et que vous pouvez faire mieux. Tape m'en cinq!
Entrez dans le cadre des types de contenu!
Eh bien, maintenant nous allons examiner de près nos modèles et les retravailler pour qu'ils soient plus «réutilisables» et intuitifs. Commençons par nous débarrasser des deux clés étrangères de notre
Comment
modèle et remplaçons-les par unGenericForeignKey
.Alors, qu'est-ce-qu'il s'est passé? Eh bien, nous sommes entrés et avons ajouté le code nécessaire pour permettre une relation générique avec d'autres modèles. Remarquez qu'il y a plus qu'un simple
GenericForeignKey
, mais aussi unForeignKey
toContentType
et unPositiveIntegerField
pour leobject_id
. Ces champs servent à indiquer à Django le type d'objet auquel il est lié et l'id de cet objet. En réalité, cela a du sens car Django aura besoin des deux pour rechercher ces objets associés.Eh bien, ce n'est pas très Python ... c'est un peu moche!
Vous êtes probablement à la recherche d'un code intuitif, impeccable et étanche qui ferait la fierté de Guido van Rossum . Je te comprends. Regardons le
GenericRelation
terrain pour que nous puissions mettre un joli arc là-dessus.Bam! Juste comme ça, vous pouvez travailler avec les commentaires pour ces deux modèles. En fait, allons-y et faisons cela dans notre shell (tapez à
python manage.py shell
partir du répertoire de votre projet Django).C'est si simple.
Quelles sont les autres implications pratiques de ces relations «génériques»?
Les clés étrangères génériques permettent des relations moins intrusives entre diverses applications. Par exemple, disons que nous avons extrait le modèle Comment dans sa propre application nommée
chatterly
. Maintenant, nous voulons créer une autre application nomméenoise_nimbus
où les gens stockent leur musique pour la partager avec d'autres.Et si nous voulons ajouter des commentaires à ces chansons? Eh bien, nous pouvons simplement dessiner une relation générique:
J'espère que vous avez trouvé cela utile, car j'aurais aimé trouver quelque chose qui m'a montré l'application plus réaliste des champs
GenericForeignKey
etGenericRelation
.Est-ce trop beau pour être vrai?
Comme pour tout dans la vie, il y a des avantages et des inconvénients. Chaque fois que vous ajoutez plus de code et plus d'abstraction, les processus sous-jacents deviennent plus lourds et un peu plus lents. L'ajout de relations génériques peut ajouter un peu d'atténuation des performances malgré le fait qu'il essaiera de mettre en cache ses résultats. Dans l'ensemble, il s'agit de savoir si la propreté et la simplicité l'emportent sur les faibles coûts de performance. Pour moi, la réponse est un million de fois oui.
Il y a plus dans le cadre des types de contenu que ce que j'ai affiché ici. Il y a tout un niveau de granularité et d'utilisation plus verbeuse, mais pour l'individu moyen, c'est ainsi que vous l'utiliserez 9 fois sur 10 à mon avis.
Relationnels génériques (?) Attention!
Une mise en garde assez importante est que lorsque vous utilisez a
GenericRelation
, si le modèle qui aGenericRelation
appliqué (Picture
) est supprimé, tous lesComment
objets related ( ) seront également supprimés. Ou du moins au moment de la rédaction de cet article.la source
GenericRelation
inPost
et quePicture
je n'ai pas besoin d'utiliserobject_id
,content_type
etcontent_object
inComment
?Ok, la réponse directe à votre question: (à partir du code source de django) est: Analyse des types de médias selon RFC 2616, section 3.7.
Quelle est la façon déchirante de dire qu'il lit / permet-vous-de-modifier / passe le long de l'en - tête httpd 'Content-type' .
Cependant, vous demandez un exemple d'utilisation plus pratique. J'ai 2 suggestions pour vous:
1: examinez ce code
2: rappelez-vous que django est python, et en tant que tel, il exerce la puissance de la communauté python. Il existe 2 super plugins RESTFul pour django. Donc, si vous voulez voir à quelle profondeur le lapin entier va, vous pouvez vérifier.
Je suggère de parcourir le didacticiel django-rest-framework qui abordera spécifiquement `` agir sur différents contenus / types ''. Remarque: il est courant d'utiliser l'en-tête de type de contenu pour «version» des API de repos .
la source