📝 Django

DRF Сериализаторы

P
Автор
Pyland
📅
Опубликовано
30.06.2026
⏱️
Время чтения
1 мин
👁️
Просмотров
74
🌿
Уровень
Средний
🐦 💼 ✈️

Сериализатор преобразует объекты модели ↔ 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)

🔐 Войдите в систему, чтобы оставить комментарий
🚪 Войти
💭

Комментариев пока нет

Станьте первым, кто поделится мнением об этой статье!

🔗 Похожие

Похожие статьи

Продолжите изучение с этими материалами

📝

pytest-django: тестирование Django

Охватываемые темы: Установка, @pytest.mark.djangodb, Фикстуры, Тестирование views.

📅 30.06.2026 👁️ 134
📝

Django: Теги шаблонов

Теги шаблонов — это логика внутри HTML. В отличие от {{ переменная }}, которая только...

📅 30.06.2026 👁️ 85
📝

Django: Статические файлы

Статические файлы — CSS, JavaScript, изображения, шрифты. Django обрабатывает их особым образом: в разработке раздаёт...

📅 30.06.2026 👁️ 73

Понравилась статья?

Подпишитесь на наши обновления и получайте новые статьи первыми. Развивайтесь вместе с PyLand!