• 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.

Symbolisches Bild von Serializer und Form


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 forms zu serializers wird, 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.

  1. Validierung: Beide Methoden rufen nach dem Einlegen der Daten if form.is_valid(): oder if serializer.is_valid(): auf.
  2. Zugriff auf validierte Daten: Nach erfolgreicher Validierung werden die bereinigten Daten im Falle von Form in form.cleaned_data und im Falle von Serializer in serializer.validated_data als Wörterbuch gespeichert. Die Namen unterscheiden sich nur geringfügig, die Funktion ist jedoch dieselbe.
  3. Fehlerprüfung: Bei fehlgeschlagener Validierung liefern form.errors oder serializer.errors Fehlermeldungen 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 der save()-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!