/
MyxaXYZ
/
TestBackend
Обзор
Документация
Войти
/
MyxaXYZ
/
TestBackend
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
forms/serializers.py
86 строк
3 KB
Maxim Sidorenko
first_commit
23 мар 2025, 17:10
23 мар 2025, 17:10
171cccc
Код
Авторство
О чём код?
from rest_framework import serializers from .models import Form, Field, FormResponse, ResponseAnswer class FieldSerializer(serializers.ModelSerializer): class Meta: model = Field fields = ['position', 'field_type', 'label', 'options'] class FormSerializer(serializers.ModelSerializer): fields = FieldSerializer(many=True, required=False) class Meta: model = Form fields = ['owner', 'id', 'title', 'fields'] def create(self, validated_data): fields_data = validated_data.pop('fields', []) form = Form.objects.create(**validated_data) for index, field_data in enumerate(fields_data, start=1): field_data['form'] = form Field.objects.create(**field_data, position=index) return form def update(self, instance, validated_data): fields_data = validated_data.pop('fields', []) instance = super().update(instance, validated_data) instance.fields.exclude(id__in=[field.get('id') for field in fields_data if field.get('id')]).delete() for field_data in fields_data: if ('position' in field_data) == False: raise serializers.ValidationError(f"В поле {field_data['label']} не указана позиция") else: field_id = field_data.get('id', None) if field_id: field = Field.objects.get(id=field_id, form=instance) for attr, value in field_data.items(): setattr(field, attr, value) field.save() else: field_data['form'] = instance Field.objects.create(**field_data) return instance class ResponseAnswerSerializer(serializers.ModelSerializer): class Meta: model = ResponseAnswer fields = ['field', 'answer'] def validate(self, attrs): field = attrs['field'] answer = attrs['answer'] if field.field_type == Field.FieldType.RADIO: options = field.options.split(',') if answer not in options: raise serializers.ValidationError(f"Ответ '{answer}' не является допустимым вариантом.") if field.field_type == Field.FieldType.CHECKBOX: selected_options = answer.split(',') allowed_options = field.options.split(',') if not all(option in allowed_options for option in selected_options): raise serializers.ValidationError("Один или несколько выбранных вариантов недопустимы.") if field.field_type == Field.FieldType.TEXT and len(answer) > 500: raise serializers.ValidationError("Текстовый ответ слишком длинный.") return attrs class ResponseSerializer(serializers.ModelSerializer): answers = ResponseAnswerSerializer(many=True) class Meta: model = FormResponse fields = ['id', 'user', 'form', 'answers', 'created_at'] def create(self, validated_data): answers_data = validated_data.pop('answers', []) response = FormResponse.objects.create(**validated_data) for answer_data in answers_data: answer_data['response'] = response # Привязываем ответы к response ResponseAnswer.objects.create(**answer_data) return response