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
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 serializersfrom django.contrib.auth import get_user_modelclass SkillSerializer(serializers.ModelSerializer):class Meta:model = Skillfields = ['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 = Employeefields = ['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 attrsdef 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