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

重写Django REST Framework创建逻辑触发TypeError错误求助

解决DRF重写perform_create触发TypeError的问题

这是一个很容易踩的小坑——参数名和模型字段不匹配,这就是你触发错误的核心原因,我来帮你梳理清楚:

问题根源

你在ReservationViewSet的perform_create方法里写了:

serializer.save(owner=self.request.user)

但你的Reservation模型里,关联用户的字段是creator,而非owner:

creator = models.ForeignKey(User, on_delete=models.PROTECT, related_name='user_reservations')

当DRF调用Reservation.objects.create()时,会把你传入的owner参数一并传递,但模型根本没有这个字段,直接就抛出了类型错误。

修复步骤

  1. 修正perform_create的参数名
    把owner改成模型对应的字段名creator即可:
class ReservationViewSet(viewsets.ModelViewSet):
    queryset = models.Reservation.objects.all()
    serializer_class = serializers.ReservationSerializer
    # 务必添加认证权限,确保request.user是已登录的有效用户
    permission_classes = [IsAuthenticated]

    def perform_create(self, serializer):
        serializer.save(creator=self.request.user)
  1. 序列化器配置无需改动
    你的序列化器里将creator设为ReadOnlyField是完全正确的:
creator = serializers.ReadOnlyField(source='creator.username')

因为这个字段是后端自动赋值的,不需要前端提交,只读配置正好符合业务逻辑。

额外注意点

一定要给视图集加上认证权限(比如上面代码里的permission_classes = [IsAuthenticated]),否则request.user可能是匿名用户,会导致外键关联失败的新错误。

内容的提问来源于stack exchange,提问作者HuLu ViCa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:47:56