0 Tage Serie
python / expert
Snippet

Django REST Framework verschachtelte Serializer-Validierung

Dieses DRF-Expertenmuster zeigt verschachtelte Serializer-Validierung und -Erstellung. Die validate()-Methode führt felderübergreifende Validierung durch, die sich über das gesamte Objekt erstreckt, und setzt Geschäftsregeln wie das Erfordernis minimaler Fähigkeiten für bestimmte Abteilungen durch. Die create()-Methode behandelt verschachtelte Objekte, indem sie diese aus validated_data extrahiert und zugehörige Instanzen separat erstellt, was die Datenbankintegrität gewährleistet.

snippet.py
python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
from rest_framework import serializers
from django.contrib.auth import get_user_model
class SkillSerializer(serializers.ModelSerializer):
class Meta:
model = Skill
fields = ['id', 'name', 'years_experience']
class EmployeeSerializer(serializers.ModelSerializer):
skills = SkillSerializer(many=True, required=False)
supervisor = serializers.PrimaryKeyRelatedField(
queryset=get_user_model().objects.all(),
required=False,
allow_null=True
)
class Meta:
model = Employee
fields = ['id', 'name', 'email', 'department', 'skills', 'supervisor']
def validate(self, attrs):
department = attrs.get('department')
skills = attrs.get('skills', [])
if department == 'Engineering' and len(skills) < 2:
raise serializers.ValidationError({
'skills': 'Engineering department requires at least 2 skills.'
})
return attrs
def create(self, validated_data):
skills_data = validated_data.pop('skills', [])
employee = Employee.objects.create(**validated_data)
for skill_data in skills_data:
Skill.objects.create(employee=employee, **skill_data)
return employee
django
Erklärung
1
SkillSerializer(many=True, required=False)
Definiert einen verschachtelten Serializer für die Handhabung mehrerer Skill-Objekte
2
PrimaryKeyRelatedField(queryset=...)
Validiert die Supervisor-ID gegen das User-Modell-Queryset
3
def validate(self, attrs):
Objektebene-Validierungsmethode, die auf alle eingereichten Daten zugreift
4
raise serializers.ValidationError({...})
Gibt Validierungsfehler mit Feldnamen als Wörterbuchschlüssel zurück
5
skills_data = validated_data.pop('skills', [])
Extrahiert verschachtelte Daten vor dem Erstellen des Elternmodells
6
Skill.objects.create(employee=employee, ...)
Erstellt zugehörige Objekte mit der Elterninstanzreferenz