- Django Form ist ein Werkzeug zur Validierung von HTML-Eingabedaten.
- DRF Serializer ist ein Werkzeug zur Validierung und Umwandlung von JSON-API-Daten.
- Beide Tools weisen bei
is_valid(), der Verarbeitung validierter Daten und der Fehlerbehandlung eine bemerkenswerte Ähnlichkeit auf.- ModelForm und ModelSerializer ähneln sich ebenfalls stark in ihrer modellbasierten automatischen Felderzeugung und Speicherstruktur.
Die Ähnlichkeiten von Django Form und DRF Serializer
Beim Einsatz von Django stehen uns zwei mächtige Wächter zur Seite, die uns oft unterstützen (und manchmal Kopfzerbrechen bereiten): Django Form und der DRF (Django REST Framework) Serializer. Im Folgenden haben wir ihre Ähnlichkeiten zusammengefasst.
Obwohl diese beiden 'Freunde' auf unterschiedlichen Bühnen agieren (Webseite vs. API), ähneln sich ihre grundlegende Rolle und Struktur auf verblüffende Weise: Beide sind dafür zuständig, externe Daten sicher zu validieren und intern zu verarbeiten, sowie interne Daten ansprechend zu verpacken und nach außen zu übermitteln.

1. Rollenvergleich auf einen Blick
Einfach ausgedrückt, sind sie wie 'Sicherheits- und Informationspersonal' am Eingang eines Kaufhauses.
- Django Form: Arbeitet hauptsächlich in der Welt der HTML-Webseiten. Es prüft, ob die vom Benutzer im Browserfenster eingegebenen Daten (Form Data) korrekt sind, und zeigt bei Fehlern freundlich eine Meldung wie "Bitte erneut eingeben" auf dem Bildschirm an.
- DRF Serializer: Arbeitet hauptsächlich in der API-Welt, wo JSON-Daten ausgetauscht werden. Es wandelt JSON-Daten, die von mobilen Apps oder Frontend-Anwendungen (wie React, Vue) gesendet wurden, in Python-Objekte um und umgekehrt verpackt es Daten aus der Datenbank schön in JSON (Serialisierung).
| Funktion | Django Form (Webseiten-zentriert) | DRF Serializer (API-zentriert) |
|---|---|---|
| Eingabe (Input) | HTML Form -> Python-Wörterbuch (cleaned_data) |
JSON-String -> Python-Wörterbuch (validated_data) |
| Datenvalidierung | Aufruf von is_valid() |
Aufruf von is_valid() |
| Ausgabe (Output) | Python-Objekt -> Rendering als HTML-Tag (<input>) |
Python-Objekt -> Umwandlung in JSON-String (Serialisierung) |
2. Warum diese Ähnlichkeit? Drei strukturelle Parallelen
Die Entwickler von DRF waren von der Struktur von Django Form so beeindruckt, dass sie diese fast vollständig als Vorlage für Serializer nutzten. Daher ähneln sich die Codestruktur und die Verwendung wie eineiige Zwillinge.
① Die Felddefinition ist identisch
Die Methode zur Spezifikation des Datenformats für eingehende Informationen ist eine exakte Kopie.
- Django Form:
from django import forms
class UserForm(forms.Form):
username = forms.CharField(max_length=100)
email = forms.EmailField()
age = forms.IntegerField()
- DRF Serializer:
from rest_framework import serializers
class UserSerializer(serializers.Serializer):
username = serializers.CharField(max_length=100)
email = serializers.EmailField()
age = serializers.IntegerField()
Abgesehen davon, dass
formszuserializerswird, ist die Logik zur Deklaration von Feldern absolut identisch.
② Validierung und Datenzugriff sind identisch
Die Methode zur Überprüfung der Datensicherheit und der Zugriff auf validierte Daten folgen demselben Fluss.
- Validierung: Beide Methoden rufen nach dem Einlegen der Daten
if form.is_valid():oderif serializer.is_valid():auf. - Zugriff auf validierte Daten: Nach erfolgreicher Validierung werden die bereinigten Daten im Falle von Form in
form.cleaned_dataund im Falle von Serializer inserializer.validated_dataals Wörterbuch gespeichert. Die Namen unterscheiden sich nur geringfügig, die Funktion ist jedoch dieselbe. - Fehlerprüfung: Bei fehlgeschlagener Validierung liefern
form.errorsoderserializer.errorsFehlermeldungen in Form eines Wörterbuchs, die Aufschluss über die Ursache geben.
③ Integration mit dem Model (ModelForm vs. ModelSerializer)
Der Kern von Django ist die Integration mit der Datenbank (Model). Beide Tools verfügen über 'Cheat-Code'-Klassen, die Felder automatisch auf Basis des Models generieren.
- Django ModelForm:
class MyModelForm(forms.ModelForm):
class Meta:
model = MyModel
fields = ['title', 'content']
- DRF ModelSerializer:
class MyModelSerializer(serializers.ModelSerializer):
class Meta:
model = MyModel
fields = ['title', 'content']
Die Syntax zur Angabe, welches Model und welche Felder über die interne
Meta-Klasse verwendet werden sollen, ist verblüffend identisch. Dank dessen ist auch die automatische Erstellung (create) oder Änderung (update) von Daten in der Datenbank beim Aufruf dersave()-Methode gleich.
Fazit
- Django Form fungiert als Dolmetscher zwischen HTML und Python und übernimmt dabei die Datenvalidierung.
- DRF Serializer fungiert als Dolmetscher zwischen JSON und Python und übernimmt dabei ebenfalls die Datenvalidierung.
Wenn Sie bereits Erfahrung mit Django Form haben, können Sie sich DRF Serializer zu über 90% als ein Formular vorstellen, das statt HTML mit JSON arbeitet. Und umgekehrt gilt: Wer zuerst mit Serializer in Berührung kam, wird auch Form leicht verstehen.
Dennoch glaube ich, dass viele Backend-Entwickler, obwohl diese beiden Tools sich stark ähneln, sich mit Serializer wohler fühlen, während sie das zugrunde liegende Form, welches die Basis für Serializer bildete, als eher umständlich empfinden. Mir geht es ebenso.
Haben Sie sich jemals gefragt, warum das so ist? Im nächsten Beitrag möchte ich erörtern, warum Django Form, obwohl es dem Serializer ähnelt, bei der Verwendung ein gewisses Unbehagen hervorrufen kann.
Wenn dieser Artikel hilfreich war, drücken Sie bitte den 'Gefällt mir'-Button und freuen Sie sich auf den nächsten Beitrag!