Es fällt mir wirklich schwer, das Konzept der Inhaltstypen von Django zu verstehen. Es fühlt sich sehr hackig an und letztendlich dagegen, wie Python dazu neigt, Dinge zu tun. Davon abgesehen muss ich innerhalb der Grenzen des Frameworks arbeiten, wenn ich Django verwenden möchte.
Ich frage mich, ob jemand ein praktisches Beispiel dafür geben kann, wie ein Inhaltstyp funktioniert und wie Sie ihn implementieren würden. Fast alle Tutorials (meistens in Blogs), die ich durchgesehen habe, machen keine großartige Arbeit, die das Konzept wirklich abdeckt. Sie scheinen dort weiterzumachen, wo die Django-Dokumentation aufgehört hat (was nirgendwo zu sein scheint).
Antworten:
Sie möchten also das Content Types-Framework für Ihre Arbeit verwenden?
Stellen Sie sich zunächst folgende Frage: "Muss eines dieser Modelle auf die gleiche Weise mit anderen Modellen in Beziehung gesetzt werden und / oder werde ich diese Beziehungen später auf unvorhergesehene Weise wiederverwenden?" Der Grund, warum wir diese Frage stellen, liegt darin, dass das Framework für Inhaltstypen dies am besten kann: Es erstellt generische Beziehungen zwischen Modellen. Blah blah, lass uns in einen Code eintauchen und sehen, was ich meine.
Okay, wir haben also eine Möglichkeit, diese Beziehung theoretisch herzustellen. Als Python-Programmierer sagt Ihnen Ihr überlegener Verstand jedoch, dass dies scheiße ist und Sie es besser machen können. Gib mir fünf!
Betreten Sie das Content Types Framework!
Nun werden wir uns unsere Modelle genauer ansehen und sie überarbeiten, um sie "wiederverwendbarer" und intuitiver zu machen. Lassen Sie uns zunächst die beiden Fremdschlüssel unseres
Comment
Modells entfernen und durch a ersetzenGenericForeignKey
.Also was ist passiert? Nun, wir haben den notwendigen Code hinzugefügt, um eine generische Beziehung zu anderen Modellen zu ermöglichen. Beachten Sie, dass es mehr als nur ein
GenericForeignKey
, sondern auch einForeignKey
zuContentType
und einPositiveIntegerField
für das gibtobject_id
. Diese Felder dienen dazu, Django mitzuteilen, mit welchem Objekttyp dies zusammenhängt und wie die ID für dieses Objekt lautet. In Wirklichkeit ist dies sinnvoll, da Django beide benötigt, um diese verwandten Objekte nachzuschlagen.Nun, das ist nicht sehr Python-artig ... es ist irgendwie hässlich!
Sie suchen wahrscheinlich nach luftdichtem, makellosem, intuitivem Code, der Guido van Rossum stolz machen würde . Ich krieg dich. Schauen
GenericRelation
wir uns das Feld an, damit wir uns hübsch verbeugen können.Bam! So können Sie mit den Kommentaren für diese beiden Modelle arbeiten. Lassen Sie uns dies in unserer Shell tun (geben Sie es
python manage.py shell
aus Ihrem Django-Projektverzeichnis ein).So einfach ist das.
Was sind die anderen praktischen Implikationen dieser "generischen" Beziehungen?
Generische Fremdschlüssel ermöglichen weniger aufdringliche Beziehungen zwischen verschiedenen Anwendungen. Angenommen, wir haben das Kommentarmodell in eine eigene App mit dem Namen gezogen
chatterly
. Jetzt möchten wir eine weitere Anwendung mit dem Namen erstellen,noise_nimbus
in der Benutzer ihre Musik speichern, um sie mit anderen zu teilen.Was ist, wenn wir diesen Songs Kommentare hinzufügen möchten? Nun, wir können einfach eine generische Beziehung zeichnen:
Ich hoffe, ihr fand das hilfreich, da ich gerne auf etwas gestoßen wäre, das mir die realistischere Anwendung von
GenericForeignKey
undGenericRelation
Feldern gezeigt hat.Ist das zu schön um wahr zu sein?
Wie bei allem im Leben gibt es Vor- und Nachteile. Jedes Mal, wenn Sie mehr Code und mehr Abstraktion hinzufügen, werden die zugrunde liegenden Prozesse schwerer und etwas langsamer. Das Hinzufügen generischer Beziehungen kann ein wenig zu einer Leistungsdämpfung führen, obwohl versucht wird, die Ergebnisse intelligent zwischenzuspeichern. Alles in allem kommt es darauf an, ob die Sauberkeit und Einfachheit die geringen Leistungskosten überwiegt. Für mich ist die Antwort millionenfach ja.
Das Content Types-Framework enthält mehr, als ich hier angezeigt habe. Es gibt ein ganzes Maß an Granularität und eine ausführlichere Verwendung, aber für den Durchschnittsmenschen werden Sie es meiner Meinung nach 9 von 10 Mal so verwenden.
Generische Relationizer (?) Vorsicht!
Eine ziemlich große Einschränkung ist, dass bei Verwendung von a
GenericRelation
, wenn das Modell mit demGenericRelation
angewendeten (Picture
) gelöscht wird, auch alle verwandten (Comment
) Objekte gelöscht werden. Oder zumindest zum Zeitpunkt dieses Schreibens.quelle
GenericRelation
in verwendePost
undPicture
dann muss ich nicht verwendenobject_id
,content_type
undcontent_object
inComment
?Ok, die direkte Antwort auf Ihre Frage: (aus dem Django-Quellcode) lautet: Analysieren von Medientypen gemäß RFC 2616, Abschnitt 3.7.
Welches ist die Tränen-Art zu sagen, dass es den httpd-Header vom Typ "Inhalt" liest / erlaubt, ihn zu ändern / weiterzugeben.
Sie fordern jedoch ein Beispiel für mehr Übung. Ich habe 2 Vorschläge für Sie:
1: Überprüfen Sie diesen Code
2: Denken Sie daran, dass Django Python ist und als solches die Macht der Python-Community ausübt. Es gibt 2 tolle RESTFul-Plugins für Django. Wenn Sie also sehen möchten, wie tief das ganze Kaninchen ist, können Sie es sich ansehen.
Ich schlage vor, das Django-Rest-Framework-Tutorial durchzugehen, in dem speziell auf verschiedene Inhalte / Typen eingegangen wird. Hinweis: Es ist üblich, den Inhaltstyp-Header zu verwenden , um restful APIs zu "versionieren" .
quelle