Охватываемые темы: Чтение вложенных объектов, Запись через 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)
Комментариев пока нет
Станьте первым, кто поделится мнением об этой статье!