diff --git a/server/apps/exam/models.py b/server/apps/exam/models.py index b86b5c2..6c3cc0c 100644 --- a/server/apps/exam/models.py +++ b/server/apps/exam/models.py @@ -50,10 +50,10 @@ class Question(CommonAModel): class Paper(CommonAModel): name = models.CharField(max_length=200, verbose_name='名称') - questions = models.ManyToManyField(Question, through='PaperQuestions') + questions = models.ManyToManyField(Question, through='PaperQuestion') limit = models.IntegerField(default=0, verbose_name='限时(分钟)') total_score = models.FloatField(default=0, verbose_name='满分') - pass_score = models.FloatField(default=0, verbose_name='及格分数') + pass_score = models.FloatField(default=0, verbose_name='通过分数') danxuan_count = models.IntegerField(default=0, verbose_name='单选数量') danxuan_score = models.FloatField(default=2, verbose_name='单选分数') duoxuan_count = models.IntegerField(default=0, verbose_name='多选数量') @@ -68,7 +68,7 @@ class Paper(CommonAModel): return self.name -class PaperQuestions(BaseModel): +class PaperQuestion(BaseModel): paper = models.ForeignKey(Paper, on_delete=models.CASCADE, verbose_name='试卷') question = models.ForeignKey(Question, on_delete=models.CASCADE, verbose_name='试题') total_score = models.FloatField(default=0, verbose_name='单题满分') @@ -78,7 +78,7 @@ class Exam(CommonAModel): """ 组织的正式考试 """ - code = models.CharField('考试编号', max_length=100, null=True, blank=True) + code = models.CharField('考试编号', max_length=100, null=True, blank=True, unique=True) name = models.CharField('名称', max_length=100) place = models.CharField('考试地点', max_length=100, null=True, blank=True) open_time = models.DateTimeField('开启时间', null=True, blank=True) @@ -91,7 +91,7 @@ class Exam(CommonAModel): def __str__(self): return self.name -class ExamTest(CommonAModel): +class ExamRecord(CommonAModel): ''' 考试记录表 ''' @@ -111,16 +111,17 @@ class ExamTest(CommonAModel): end_time = models.DateTimeField(verbose_name='结束答题时间') detail = models.ManyToManyField(Question, verbose_name='答题记录', through='AnswerDetail') is_pass = models.BooleanField(default=True, verbose_name='是否通过') - exam = models.ForeignKey(Exam, verbose_name='关联的正式考试', null=True, blank=True, related_name='examtest_exam', on_delete= models.SET_NULL) + exam = models.ForeignKey(Exam, verbose_name='关联的正式考试', null=True, blank=True, on_delete= models.SET_NULL) + questions = JSONField(default=list, verbose_name='下发的题目列表', blank=True) class Meta: - verbose_name = '模拟考试' + verbose_name = '考试记录' verbose_name_plural = verbose_name class AnswerDetail(BaseModel): - examtest = models.ForeignKey(ExamTest, on_delete=models.CASCADE, related_name='answerdetail_examtest') + examrecord = models.ForeignKey(ExamRecord, on_delete=models.CASCADE) question = models.ForeignKey(Question, on_delete=models.CASCADE) user_answer = JSONField(null=True,blank=True) score = models.FloatField(default=0, verbose_name='本题得分') diff --git a/server/apps/exam/serializers.py b/server/apps/exam/serializers.py index 765ddfd..fe2e326 100644 --- a/server/apps/exam/serializers.py +++ b/server/apps/exam/serializers.py @@ -1,6 +1,7 @@ -from rest_framework.serializers import ModelSerializer, CharField +from rest_framework.serializers import ModelSerializer, CharField, Serializer, SerializerMethodField, FloatField +from rest_framework import serializers -from apps.exam.models import Question, Questioncat, Paper, Exam +from apps.exam.models import Question, Questioncat, Paper, Exam, PaperQuestion class QuestioncatSerializer(ModelSerializer): @@ -20,6 +21,45 @@ class PaperSerializer(ModelSerializer): 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 @@ -29,4 +69,7 @@ class ExamListSerializer(ModelSerializer): create_by_name = CharField(source='create_by.name', read_only=True) class Meta: model = Exam - fields = '__all__' \ No newline at end of file + fields = '__all__' + +class ExamAttendSerializer(Serializer): + code = CharField(label="考试编号") \ No newline at end of file