Сериализатор преобразует объекты модели ↔ Python dict ↔ JSON.
ModelSerializer
from rest_framework import serializers
from .models import Task, Project
class TaskSerializer(serializers.ModelSerializer):
class Meta:
model = Task
fields = ['id', 'title', 'status', 'priority', 'created_at']
read_only_fields = ['id', 'created_at']
Кастомные поля
class TaskSerializer(serializers.ModelSerializer):
owner_name = serializers.SerializerMethodField()
days_old = serializers.SerializerMethodField()
class Meta:
model = Task
fields = ['id', 'title', 'owner_name', 'days_old']
def get_owner_name(self, obj):
return obj.owner.get_full_name() if obj.owner else None
def get_days_old(self, obj):
from django.utils import timezone
delta = timezone.now() - obj.created_at
return delta.days
Вложенные сериализаторы
class ProjectSerializer(serializers.ModelSerializer):
class Meta:
model = Project
fields = ['id', 'name']
class TaskSerializer(serializers.ModelSerializer):
project = ProjectSerializer(read_only=True)
project_id = serializers.PrimaryKeyRelatedField(
queryset=Project.objects.all(),
source='project',
write_only=True,
)
class Meta:
model = Task
fields = ['id', 'title', 'project', 'project_id']
Валидация
class TaskSerializer(serializers.ModelSerializer):
class Meta:
model = Task
fields = ['title', 'priority']
def validate_priority(self, value):
if value < 0 or value > 10:
raise serializers.ValidationError("Приоритет от 0 до 10")
return value
def validate(self, attrs):
if attrs.get('status') == 'done' and not attrs.get('title'):
raise serializers.ValidationError("Выполненная задача должна иметь название")
return attrs
Использование в view
# Чтение (сериализация)
serializer = TaskSerializer(task)
data = serializer.data # dict
# Список
serializer = TaskSerializer(tasks, many=True)
# Запись (десериализация)
serializer = TaskSerializer(data=request.data)
if serializer.is_valid(raise_exception=True):
task = serializer.save(owner=request.user)
# Обновление
serializer = TaskSerializer(task, data=request.data, partial=True)
💬 Комментарии (0)
Комментариев пока нет
Станьте первым, кто поделится мнением об этой статье!