You need to enable JavaScript to run this app. Django DRF嵌套序列化器创建对象时如何自动绑定已认证用户
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 20:57:00