如何在Django REST中同时创建并更新对象?解决Response报错
问题:创建UserClassQuestionsRecord对象后更新ClassAttempt对象的实现问题
需求
创建UserClassQuestionsRecord对象后,更新对应的ClassAttempt对象,但当前代码运行报错,无法实现需求。
现有视图代码
class CreateUserClassQuestionRecord(CreateAPIView): queryset = UserClassQuestionsRecord.objects.all() serializer_class = User_Class_Question_RecordSerializer permission_classes = [IsAuthenticated] def create(self, request, *args, **kwargs): user_inf = UserClassQuestionsRecord.objects.filter(user=self.request.user, question__singleclass_id=self.kwargs.get('pk')).all() for c in user_inf: if c: ClassAttempt.objects.filter(user=self.request.user, related_class_id=self.kwargs.get('pk')).update( is_first_time=False) Response(status.HTTP_200_OK) else: pass
请求JSON数据
{ "is_correct": "True", "xp_collected": 10, "user": 1, "question": 1, "selected_answer": 13 }
请求URL
http://127.0.0.1:8000/api/class-record/new/13/
报错信息
- 中文翻译:
Response.__init__()只接受1个位置参数,但传入了2个 - 原错误:
Response.__init__() takes 1 positional argument but 2 were given
问题分析与解决方案
错误原因
- Response调用错误:Django REST Framework的
Response类构造函数中,状态码需要通过关键字参数status=传递,直接把status.HTTP_200_OK作为位置参数传入会触发参数错误。 - 逻辑偏离需求:当前代码先查询已有
UserClassQuestionsRecord记录,再尝试更新ClassAttempt,但需求是创建新的UserClassQuestionsRecord之后更新ClassAttempt,原逻辑完全搞反,且循环查询集的写法冗余。
修正后的代码
class CreateUserClassQuestionRecord(CreateAPIView): queryset = UserClassQuestionsRecord.objects.all() serializer_class = User_Class_Question_RecordSerializer permission_classes = [IsAuthenticated] def create(self, request, *args, **kwargs): # 先调用父类方法完成UserClassQuestionsRecord对象的创建 response = super().create(request, *args, **kwargs) # 获取URL中的班级ID class_id = self.kwargs.get('pk') # 创建成功后,更新对应的ClassAttempt对象 ClassAttempt.objects.filter( user=self.request.user, related_class_id=class_id ).update(is_first_time=False) return response
额外说明
如果需求是仅当用户第一次创建该班级的UserClassQuestionsRecord时才更新ClassAttempt,可以调整逻辑为:
def create(self, request, *args, **kwargs): class_id = self.kwargs.get('pk') # 检查用户是否已有该班级的答题记录 has_record = UserClassQuestionsRecord.objects.filter( user=self.request.user, question__singleclass_id=class_id ).exists() # 调用父类方法创建新记录 response = super().create(request, *args, **kwargs) # 仅当是第一次创建时更新ClassAttempt if not has_record: ClassAttempt.objects.filter( user=self.request.user, related_class_id=class_id ).update(is_first_time=False) return response
内容的提问来源于stack exchange,提问作者Riccardo
相关产品推荐
相关产品推荐

