Django提交全部必填数据仍无法创建QuestionReply模型如何解决
问题原因
- 外键字段赋值不符合Django规范:Django模型的外键字段直接赋值时,要求传入关联模型的实例对象,你当前直接给
reply_user传了字符串格式的用户ID"1",给reply_question传了路径中的整数ID,都不是对应的cUser、Question实例,因此创建模型实例时会触发类型校验错误。 - 全局异常捕获掩盖了具体报错信息,导致你无法直观看到错误原因。
解决方法
你可以选择以下任意一种方案修复问题:
方案1:查询关联实例后赋值
先根据ID查询到对应的关联模型实例,再赋值给外键字段,逻辑更直观,适合需要提前校验关联数据是否存在的场景:
# views.py 修改后的代码 class AddQuestionReply(APIView): def post(self, request, id): try: reply = request.data.get('reply') # 将字符串类型的用户ID转为整数,查询对应cUser实例 reply_user_id = int(request.data.get('reply_user')) reply_user = cUser.objects.get(id=reply_user_id) # 查询对应Question实例 reply_question = Question.objects.get(id=id) reply_to_question = models.QuestionReply( reply_user=reply_user, reply_question=reply_question, reply=reply ) reply_to_question.save() return Response({'OK': 'Reply added'}, status=status.HTTP_200_OK) except Exception as e: # 开发阶段可以打印具体错误信息方便排查,上线可移除 print(e) return Response({'400': 'QuestionReply has invalid data'}, status=status.HTTP_400_BAD_REQUEST)
方案2:直接赋值外键ID属性
Django会为每个外键字段自动生成{外键字段名}_id的属性,直接给该属性赋值ID值即可,不需要额外查询关联表,性能更高:
# views.py 修改后的代码 class AddQuestionReply(APIView): def post(self, request, id): try: reply = request.data.get('reply') reply_user_id = int(request.data.get('reply_user')) reply_to_question = models.QuestionReply( reply_user_id=reply_user_id, reply_question_id=id, reply=reply ) reply_to_question.save() return Response({'OK': 'Reply added'}, status=status.HTTP_200_OK) except Exception as e: print(e) return Response({'400': 'QuestionReply has invalid data'}, status=status.HTTP_400_BAD_REQUEST)
内容的提问来源于stack exchange,提问作者Lun
相关产品推荐
相关产品推荐

