python / expert
Snippet
Django REST Framework Verschachtelte Serializer Validierung mit Source Aliases
Verschachtelte Serializer in Django REST Framework ermöglichen komplexe Objektstrukturen, die in einer einzigen Anfrage validiert und erstellt werden können. Die Haupt-Herausforderung liegt in der korrekten Validierung verschachtelter Daten bei gleichzeitiger Aufrechterhaltung klarer Trennung der Zuständigkeiten. Die Verwendung separater Validierungsmethoden für jedes Feld und die Handhabung der verschachtelten Struktur in create() ermöglicht robuste Eingabeverarbeitung und korrekte Fehlermeldungen auf beiden Ebenen.
snippet.py
1
from rest_framework import serializers\nfrom django.contrib.auth import get_user_model\n\nUser = get_user_model()\n\nclass ProfileSerializer(serializers.Serializer):\n website = serializers.URLField(required=False)\n bio = serializers.CharField(max_length=500, required=False)\n\nclass UserRegistrationSerializer(serializers.Serializer):\n email = serializers.EmailField()\n username = serializers.RegexField(\n regex=r'^[a-zA-Z0-9_]+$',\n max_length=20\n )\n password = serializers.CharField(write_only=True, min_length=8)\n profile = ProfileSerializer()\n\n def validate_email(self, value):\n if User.objects.filter(email__iexact=value).exists():\n raise serializers.ValidationError('Email already registered')\n return value.lower()\n\n def validate_username(self, value):\n if User.objects.filter(username__iexact=value).exists():\n raise serializers.ValidationError('Username taken')\n return value.lower()\n\n def create(self, validated_data):\n profile_data = validated_data.pop('profile')\n user = User.objects.create_user(**validated_data)\n user.profile.website = profile_data.get('website', '')\n user.profile.bio = profile_data.get('bio', '')\n user.profile.save()\n return user
django
Erklärung
1
profile = ProfileSerializer()
Deklariert verschachtelten Serializer, den DRF automatisch instanziiert und validiert, was hierarchische Datenstruktur in API-Anfragen ermöglicht
2
def validate_email(self, value):
Custom Field-Level Validator, der die Datenbank auf doppelte E-Mails mit case-insensitive Query prüft
3
def validate_username(self, value):
Regex-Validierung kombiniert mit Datenbank-Eindeutigkeitsprüfung stellt sicher, dass Username Format und Verfügbarkeit erfüllt
4
def create(self, validated_data):
Extrahiert verschachtelte Profile-Daten aus validiertem Payload, erstellt User zuerst, dann füllt verwandtes Profile mit verschachtelten Werten