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

Django Rest Framework接口创建用户时上传头像仍保存默认图片问题

问题原因

你的问题出在两处逻辑遗漏,导致上传的avatar字段没有被写入用户创建流程:

  1. 自定义的用户管理器myAccountManager的create_user方法没有接收和处理avatar参数
  2. 序列化器的create方法调用create_user时,没有将前端上传的avatar值传入
修复步骤

1. 修改自定义用户管理器

调整create_user方法,增加avatar参数的处理逻辑:

class myAccountManager(BaseUserManager):
    # 新增avatar参数,默认值为None
    def create_user(self, email, username, password=None, avatar=None):
        if not email:
            raise ValueError('Users must have an email')
        
        if not username:
            raise ValueError('Users must have an username')
        
        user = self.model(
            email = self.normalize_email(email),
            username=username,
            # 赋值avatar,无传入时用默认值
            avatar=avatar if avatar else 'default.jpg',
        )

        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, username, password):
        user = self.create_user(
            email = self.normalize_email(email),
            password=password,
            username=username,
        )
        user.is_admin=True
        user.is_staff=True
        user.is_superuser=True
        user.save(using=self._db)
        return user

2. 修改用户序列化器

在调用create_user时传入avatar参数:

UserModel = User

class UserSerializer(serializers.ModelSerializer):
    password = serializers.CharField(write_only=True)

    def create(self, validated_data):
        user = UserModel.objects.create_user(
            username=validated_data['username'],
            password=validated_data['password'],
            email=validated_data['email'],
            # 新增avatar参数传入
            avatar=validated_data.get('avatar')
        )
        return user

    class Meta:
        model = UserModel
        fields = ( "id", "email", "username", "password", "avatar")

3. 视图解析器配置(若未配置需补充)

DRF默认的JSON解析器无法处理文件上传,需要在用户创建视图中新增文件解析器:

from rest_framework.parsers import MultiPartParser, FormParser
from rest_framework import generics

class UserCreateView(generics.CreateAPIView):
    serializer_class = UserSerializer
    # 新增解析器配置
    parser_classes = (MultiPartParser, FormParser)
补充说明

Django管理后台可以正常保存头像,是因为后台直接调用模型的默认保存逻辑,会自动处理所有注册的模型字段,不会走你自定义的create_user方法,所以不受影响。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 03:54:03