重写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参数一并传递,但模型根本没有这个字段,直接就抛出了类型错误。
修复步骤
- 修正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)
- 序列化器配置无需改动
你的序列化器里将creator设为ReadOnlyField是完全正确的:
creator = serializers.ReadOnlyField(source='creator.username')
因为这个字段是后端自动赋值的,不需要前端提交,只读配置正好符合业务逻辑。
额外注意点
一定要给视图集加上认证权限(比如上面代码里的permission_classes = [IsAuthenticated]),否则request.user可能是匿名用户,会导致外键关联失败的新错误。
内容的提问来源于stack exchange,提问作者HuLu ViCa
相关产品推荐
相关产品推荐

