需求:用户将选择型问答提交,前端返回所有问答数据,将问答数据批量修改入到数据库中
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))