📝 Django

Вложенные сериализаторы в DRF

P
Автор
PyLand Team
📅
Опубликовано
30.06.2026
⏱️
Время чтения
1 мин
👁️
Просмотров
299
🏆
Уровень
Эксперт

Охватываемые темы: Чтение вложенных объектов, Запись через ID, чтение как объект, Вложенный список (обратная связь), Запись вложенных объектов.

Чтение вложенных объектов

class ProjectSerializer(serializers.ModelSerializer):
    class Meta:
        model = Project
        fields = ['id', 'name']

class TaskSerializer(serializers.ModelSerializer):
    project = ProjectSerializer(read_only=True)  # вложенный объект

    class Meta:
        model = Task
        fields = ['id', 'title', 'status', 'project']

Ответ API:

{
  "id": 1,
  "title": "Задача",
  "project": {"id": 5, "name": "Мой проект"}
}

Запись через ID, чтение как объект

class TaskSerializer(serializers.ModelSerializer):
    project = ProjectSerializer(read_only=True)         # для GET
    project_id = serializers.PrimaryKeyRelatedField(    # для POST/PUT
        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 = ['id', 'title', 'status']

class ProjectSerializer(serializers.ModelSerializer):
    tasks = TaskSerializer(many=True, read_only=True)  # через related_name='tasks'

    class Meta:
        model = Project
        fields = ['id', 'name', 'tasks']

Запись вложенных объектов

class ProjectSerializer(serializers.ModelSerializer):
    tasks = TaskSerializer(many=True)

    class Meta:
        model = Project
        fields = ['id', 'name', 'tasks']

    def create(self, validated_data):
        tasks_data = validated_data.pop('tasks', [])
        project = Project.objects.create(**validated_data)
        for task_data in tasks_data:
            Task.objects.create(project=project, **task_data)
        return project

    def update(self, instance, validated_data):
        tasks_data = validated_data.pop('tasks', [])
        instance = super().update(instance, validated_data)
        # Обновить задачи...
        return instance

SerializerMethodField

class TaskSerializer(serializers.ModelSerializer):
    project_name = serializers.SerializerMethodField()

    def get_project_name(self, obj):
        return obj.project.name if obj.project else None

Ваша реакция на статью

💬 Комментарии (0)

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

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

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

🔗 Похожие

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

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

📝

Поиск в Django

Поиск в Django можно начать с простых ORM-фильтров, а для ранжирования и полнотекстового поиска использовать...

📅 30.06.2026 👁️ 277
📝

Swagger документация с drf-spectacular

drf-spectacular генерирует OpenAPI 3.0 схему и Swagger UI для DRF.

📅 30.06.2026 👁️ 561
📝

settings.py: настройки Django

settings.py — центральный конфигурационный файл Django-проекта.

📅 30.06.2026 👁️ 314

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

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