DRF批量修改序列化器使用

需求:用户将选择型问答提交,前端返回所有问答数据,将问答数据批量修改入到数据库中

model 

class QuestionnairQA(BaseModel):
    question_choices = (
        (1, _("问题1")),
        (2, _("问题2")),
        (3, _("问题3")),
        (4, _("问题4")),
        (5, _("问题5"))
    )
    answer_choices = (
        (0, '未作答'),
        (1, 'A'),
        (2, 'B'),
        (3, 'C'),
        (4, 'D'),
        (5, 'E'),
    )
    # plan = models.ForeignKey(Plan, on_delete=models.SET_NULL, null=True, verbose_name="项目", db_constraint=False)
    # project_questionnair = models.ForeignKey(ProjectQuestionnaire, on_delete=models.SET_NULL, null=True,
    #                                          verbose_name="项目问卷", db_constraint=False)
    feedback = models.ForeignKey(FeedbackList, on_delete=models.SET_NULL, null=True, verbose_name="反馈列表", db_constraint=False)
    question = models.SmallIntegerField(choices=question_choices, default=0, verbose_name='问题')
    answer = models.SmallIntegerField(choices=answer_choices, default=0, verbose_name='回答')

    class Meta:
        db_table = "question_answer"
        verbose_name = "问答"
        verbose_name_plural = verbose_name

serializer

class QuestionnairQAListSerializer(serializers.ListSerializer):
    # 重写update函数
    def update(self, instance, validated_data):
        # print(instance)
        # print(validated_data)
        # 保存数据
        # self.child:是BookModelSerializer对象
        # 方式二:
        return [
            # self.child.update(对象,字典) for attrs in validated_data
            self.child.update(instance[i], attrs) for i, attrs in enumerate(validated_data)
        ]


class QuestionnairQASerializer(serializers.ModelSerializer):

    question_detail = serializers.SerializerMethodField()

    def get_question_detail(self, instance):
        return instance.get_question_display()


    class Meta:
        model = QuestionnairQA
        list_serializer_class = QuestionnairQAListSerializer
        fields = (
            'id', 'question', 'question_detail', 'answer'
        )

view

@init_project
    @transaction.atomic()
    def update_question_answer(self, request):
        """
        前端传的数据格式 [
        {'id': 1, question: 1, 'answer': 1},
        {'id': 2, question: 2, 'answer': 2}
        ]
        """
        if not request.data.get('feedback_id'):
            return Response_400('未选择反馈记录')
        qa_list = request.data.get('qa_list')
        # 查看选项中是否含有D/E选项
        answer = [data['answer'] for data in qa_list[0:4]]
        if 4 in answer or 5 in answer:
            # 有D或者E选项  修改反馈记录
            FeedbackList.objects.filter(id=request.data.get('feedback_id')).update(is_has_D_E=True)
        else:
            FeedbackList.objects.filter(id=request.data.get('feedback_id')).update(is_has_D_E=False)
        # 批量修改代码 将前端传入的数据格式化后 通过序列化器反序列化
        try:
            choices_qa = qa_list[0:5]
            pks = []
            for dic in choices_qa:
                pk = dic.pop('id')
                pks.append(pk)
            qa_query = QuestionnairQA.objects.filter(is_delete=False, id__in=pks).all()
            if len(pks) != len(qa_query):
                return Response_400('问答数据不完整')
        except Exception as e:
            return Response_400('问答数据不完整')
        serializer = self.get_serializer(instance=qa_query, data=choices_qa, many=True)
        serializer.is_valid(raise_exception=True)
        serializer.save()
        # 保存建议数据
        opinion = qa_list[-1]
        opinion_query = QuestionnaireOpinion.objects.get(id=opinion['id'])
        opinion_ser = QuestionnaireOpinionSerializer(opinion_query, opinion)
        opinion_ser.is_valid(raise_exception=True)
        opinion_ser.save()
        return Response_200(_(UPDATE_SUCCEEDED))

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值