from rest_framework.serializers import ModelSerializer, CharField, Serializer, SerializerMethodField, FloatField from rest_framework import serializers from apps.exam.models import Question, Questioncat, Paper, Exam, PaperQuestion class QuestioncatSerializer(ModelSerializer): class Meta: model = Questioncat fields = '__all__' class QuestionSerializer(ModelSerializer): class Meta: model = Question fields = '__all__' class PaperSerializer(ModelSerializer): class Meta: model = Paper exclude = ('questions',) class QuestionReadSerializer(ModelSerializer): class Meta: model = Question exclude = ['right'] class PaperQuestionSerializer(Serializer): id = CharField(label='题目ID') total_score = FloatField(label='单题满分') class PaperCreateUpdateSerializer(ModelSerializer): questions_ = PaperQuestionSerializer(many=True) class Meta: model = Paper fields = '__all__' class PaperQuestionDetailSerializer(ModelSerializer): id = serializers.IntegerField(source='question.id') name = serializers.ReadOnlyField(source='question.name') options = serializers.ReadOnlyField(source='question.options') right = serializers.ReadOnlyField(source='question.right') type = serializers.ReadOnlyField(source='question.type') img = serializers.ReadOnlyField(source='question.img') questioncat_name = serializers.ReadOnlyField(source='question.questioncat.name') level = serializers.ReadOnlyField(source='question.level') class Meta: model = PaperQuestion fields = ('id','name','options','right','type','level','total_score','questioncat_name', 'img') class PaperDetailSerializer(ModelSerializer): questions_ = SerializerMethodField() class Meta: model = Paper fields = '__all__' def get_questions_(self, instance): pqs = PaperQuestion.objects.filter(paper=instance) return PaperQuestionDetailSerializer(pqs, many=True).data class ExamCreateUpdateSerializer(ModelSerializer): class Meta: model = Exam fields = ['name', 'place', 'open_time', 'close_time', 'proctor_name', 'proctor_phone'] class ExamListSerializer(ModelSerializer): create_by_name = CharField(source='create_by.name', read_only=True) class Meta: model = Exam fields = '__all__' class ExamAttendSerializer(Serializer): code = CharField(label="考试编号")