Django中调用save()时出现TypeError: __call__()缺少必填关键字参数'manager'的问题解决
解决Django中
post_obj.save()触发的TypeError问题 嘿,我一眼就瞅出问题在哪了!你在视图里用Customer.objects.filter(id=id)拿到的是一个QuerySet对象(也就是一组符合条件的Customer实例),但Post模型的owner字段是ForeignKey,它要求传入的是单个Customer实例,而不是QuerySet。这就是调用save()时抛出__call__() missing 1 required keyword-only argument: 'manager'错误的根本原因。
修复方案有两种,选哪种都能解决问题:
方案一:用
get()获取单个实例(适用于确定该ID对应的用户一定存在的场景)
修改views.py中的代码,注意要捕获DoesNotExist异常,避免找不到用户时程序崩溃:@api_view(["POST"]) def create_post(request): if request.data != {}: id = request.data["customer_id"] title = request.data["title"] try: # 改用get()获取单个Customer实例 user = Customer.objects.get(id=id) post_obj = Post(owner=user, title=title) post_obj.save() # 这里可以添加成功响应,比如: # return Response({"status": "Post created successfully"}, status=201) except Customer.DoesNotExist: # 处理用户不存在的情况 return Response({"error": "Customer not found"}, status=404)方案二:用
first()从QuerySet中取第一个实例(更安全的场景,适配可能无结果的情况)
如果你不确定是否存在匹配的用户,或者想优雅处理无结果的情况,可以这样写:@api_view(["POST"]) def create_post(request): if request.data != {}: id = request.data["customer_id"] title = request.data["title"] # 从filter结果中取第一个实例,无匹配则返回None user = Customer.objects.filter(id=id).first() if user is not None: post_obj = Post(owner=user, title=title) post_obj.save() # 返回成功响应 # return Response({"status": "Post created successfully"}, status=201) else: # 用户不存在时返回错误信息 return Response({"error": "Customer not found"}, status=404)
小补充:
你原来的if user.count() != 0:其实可以简化——QuerySet本身在布尔判断中会自动检测是否包含数据,比如直接写if user:就完全能替代if user.count() !=0:,不过用上面两种修复方案后,这个判断逻辑也可以跟着调整啦。
内容的提问来源于stack exchange,提问作者shamsucm
相关产品推荐
相关产品推荐

