from rest_framework import serializers from question.models import Questioncat from crm.models import Consumer from .models import ExamTest, AnswerDetail, Banner from .models_paper import TestRule, WorkScope, Paper, PaperQuestions from question.serializers import QuestionSerializer class BannerSerializer(serializers.ModelSerializer): """ 轮播图序列化 """ class Meta: model = Banner fields = ('id','name','path', 'url', 'sort') class TestRuleSerializer(serializers.ModelSerializer): """ 规则序列化 """ create_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False, read_only=True) update_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False, read_only=True) class Meta: model = TestRule fields = '__all__' class WorkScopeSerializer(serializers.ModelSerializer): """ 工作类别序列化 """ create_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False, read_only=True) update_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False, read_only=True) subject_name = serializers.StringRelatedField(source='subject',read_only=True) class Meta: model = WorkScope fields = '__all__' @staticmethod def setup_eager_loading(queryset): """ Perform necessary eager loading of data. """ queryset = queryset.prefetch_related('questioncat',) return queryset class MoniTestSerializer(serializers.ModelSerializer): """ 模考序列化 """ start_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S") end_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S") consumer = serializers.PrimaryKeyRelatedField(queryset=Consumer.objects.all(), required=False) create_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False, read_only=True) update_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False, read_only=True) class Meta: model = ExamTest fields = '__all__' class ExamTestListSerializer(serializers.ModelSerializer): """ 考试列表序列化 """ start_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S") end_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S") workscope_name = serializers.StringRelatedField(source='workscope', read_only=True) paper_name = serializers.StringRelatedField(source='paper', read_only=True) consumer_name = serializers.SerializerMethodField() took_format = serializers.SerializerMethodField() consumer_company_name = serializers.SerializerMethodField() class Meta: model = ExamTest exclude = ('detail',) def get_consumer_name(self, obj): return obj.consumer.name def get_took_format(self, obj): m, s = divmod(obj.took, 60) h, m = divmod(m, 60) return "%02d:%02d:%02d" % (h, m, s) def get_consumer_company_name(self, obj): if obj.consumer.company: return obj.consumer.company.name @staticmethod def setup_eager_loading(queryset): """ Perform necessary eager loading of data. """ queryset = queryset.select_related('consumer','paper', 'workscope') return queryset class AnswerDetailSerializer(serializers.ModelSerializer): class Meta: model = AnswerDetail exclude = ('examtest',) # fields = '__all__' depth = 1 @staticmethod def setup_eager_loading(queryset): """ Perform necessary eager loading of data. """ # select_related for "to-one" relationships queryset = queryset.select_related('examtest',) # prefetch_related for "to-many" relationships queryset = queryset.prefetch_related( 'question',) # Prefetch for subsets of relationships # queryset = queryset.prefetch_related( # Prefetch('unaffiliated_attendees', # queryset=Attendee.objects.filter(organization__isnull=True)) # ) return queryset class AnswerDetailCreateSerializer(serializers.ModelSerializer): class Meta: model = AnswerDetail fields = '__all__' class PaperSerializer(serializers.ModelSerializer): create_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False, read_only=True) update_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False, read_only=True) workscope_name = serializers.StringRelatedField(source='workscope', read_only=True) class Meta: model = Paper exclude = ('questions',) class PaperQuestionsDetailSerializer(serializers.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') questioncat_name = serializers.ReadOnlyField(source='question.questioncat.name') level = serializers.ReadOnlyField(source='question.level') class Meta: model = PaperQuestions fields = ('id','name','options','right','type','level','total_score','questioncat_name') class PaperDetailSerializer(serializers.ModelSerializer): create_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False, read_only=True) update_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False, read_only=True) workscope_name = serializers.StringRelatedField(source='workscope', read_only=True) questions = PaperQuestionsDetailSerializer(source='paperquestions_set', many=True, read_only=True) class Meta: model = Paper fields = '__all__' class PaperQuestionsCreateSerializer(serializers.ModelSerializer): class Meta: model = PaperQuestions fields = '__all__'