Django DRF嵌套序列化器创建对象时如何自动绑定已认证用户
实现方案
你只需要修改序列化器和视图两处代码即可实现需求,核心逻辑是让author字段仅在序列化返回时展示,反序列化创建时自动从请求上下文取当前登录用户填充,不需要前端传入。
1. 修改AnnouncementSerializer序列化器
将author字段设置为只读,取消传入要求,序列化返回时仍然会正常展示作者信息:
class AnnouncementSerializer(serializers.ModelSerializer): # 仅序列化返回时展示作者信息,不要求前端传入 author = UserSerializer(read_only=True) parameters = ParameterSerializer(many=True, required=False) photo = PhotoSerializer(many=True, required=False) class Meta: model = Announcement fields = ['id', 'name', 'author', 'parameters', 'photo']
修改后DRF在处理提交请求时,不会再校验author字段是否传入,返回公告数据时仍然会按照UserSerializer的配置序列化作者信息,所有用户查看公告时都能正常看到作者信息。
2. 修改AnnouncementCreate视图
重写perform_create钩子方法,在保存公告时自动绑定当前登录用户为作者:
class AnnouncementCreate(CreateAPIView): permission_classes = [IsAuthenticated] queryset = models.Announcement.objects.all() serializer_class = AnnouncementSerializer def perform_create(self, serializer): # 从已认证的请求中直接取当前用户,绑定为公告作者 serializer.save(author=self.request.user)
perform_create会在序列化器校验通过后、正式保存数据前调用,此处手动传入的author参数优先级最高,会覆盖序列化器的默认逻辑完成自动绑定。
可选补充:支持嵌套字段写入
如果你需要创建公告时同时提交关联的parameters和photo数据,需要额外重写序列化器的create方法,因为DRF默认不支持嵌套序列化器的写入操作:
class AnnouncementSerializer(serializers.ModelSerializer): author = UserSerializer(read_only=True) parameters = ParameterSerializer(many=True, required=False) photo = PhotoSerializer(many=True, required=False) class Meta: model = Announcement fields = ['id', 'name', 'author', 'parameters', 'photo'] def create(self, validated_data): # 取出关联字段数据 parameters_data = validated_data.pop('parameters', []) photo_data = validated_data.pop('photo', []) # 先创建公告主体,author会从视图层传入 announcement = Announcement.objects.create(**validated_data) # 批量创建关联参数 for param in parameters_data: Parameter.objects.create(announcement=announcement, **param) # 关联照片,可根据业务逻辑调整为直接创建或关联已有数据 for photo in photo_data: photo_obj, _ = Photo.objects.get_or_create(**photo) announcement.photo.add(photo_obj) return announcement
内容的提问来源于stack exchange,提问作者Zero0
相关产品推荐
相关产品推荐

