0 Tage Serie
python / intermediate
Snippet

Django REST Framework Benutzerdefinierte Serializer-Feldvalidierung

Dieses Snippet zeigt Validierungstechniken für Django REST Framework Serializer. ModelSerializer bietet automatische Validierung, aber benutzerdefinierte Feldvalidierung ermöglicht feinkörnige Kontrolle. Die validate_<Feld> Methode prüft einzelne Felder, während validate() objektebene Validierung über mehrere Felder durchführt. Dieses Muster stellt Datenintegrität vor dem Erreichen der Datenbank sicher.

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
from rest_framework import serializers
from .models import Product
class ProductSerializer(serializers.ModelSerializer):
price = serializers.DecimalField(
max_digits=10,
decimal_places=2,
min_value=0.01
)
class Meta:
model = Product
fields = ['id', 'name', 'price', 'stock']
def validate_price(self, value):
if value < 0:
raise serializers.ValidationError("Price cannot be negative")
return value
def validate_stock(self, value):
if value < 0:
raise serializers.ValidationError("Stock cannot be negative")
return value
def validate(self, data):
if data.get('price') and data.get('stock'):
total_value = data['price'] * data['stock']
if total_value > 1000000:
raise serializers.ValidationError(
"Total inventory value exceeds limit"
)
return data
django
Erklärung
1
from rest_framework import serializers
Importiere DRF Serialisierer-Modul für Serialisierer-Klassen
2
price = serializers.DecimalField(...)
Definiere benutzerdefiniertes DecimalField mit Präzisions- und Minimalwertgrenzen
3
def validate_price(self, value):
Benutzerdefinierte Feld-Level-Validierungsmethode für das Preis-Feld
4
raise serializers.ValidationError(...)
Validierungsfehler auslösen wenn Preis negativ ist
5
def validate(self, data):
Objekt-Level-Validierungsmethode die auf alle Felder im Daten-Dictionary zugreift
6
total_value = data['price'] * data['stock']
Berechne bereichsübergreifende Geschäftsregel-Einschränkung
7
raise serializers.ValidationError(...)
Ablehnung wenn Gesamtlagerbestandswert Geschäftslimit überschreitet