You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

问题分析与解决方案

错误原因

  1. Response调用错误:Django REST Framework的Response类构造函数中,状态码需要通过关键字参数status=传递,直接把status.HTTP_200_OK作为位置参数传入会触发参数错误。
  2. 逻辑偏离需求:当前代码先查询已有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 19:41:00