【问题标题】:Unable to create profile from user Serializer (Django-resst-framework)无法从用户序列化程序(Django-rest-framework)创建配置文件
【发布时间】:2022-01-26 02:15:31
【问题描述】:

我有 2 个模型,如图所示的 Account 模型

class Account(AbstractBaseUser,PermissionsMixin):
    email = models.EmailField(max_length=100, unique = True)
    username = models.CharField(max_length = 30)
    is_admin = models.BooleanField(default = False)
    is_staff = models.BooleanField(default = False)
    is_active = models.BooleanField(default = False)
    date_joined = models.DateTimeField(auto_now_add = True)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = [
       'username'
    ]

以及如下图的配置文件表

class Profile(models.Model):
    user = models.OneToOneField(Account, on_delete = models.CASCADE)
    avatar = models.ImageField(default = "defaultpic.png", blank = True, null = True, upload_to="MEDIA_FILES" )
    tel = PhoneField(blank=False, null = False)

ProfileSerializer

class ProfileSerializer(serializers.ModelSerializer):
class Meta:
    model = Profile
    fields = [
        'avatar',
        'tel',
    ]

用户序列化器

class AccountSerializer(serializers.ModelSerializer):
profile = ProfileSerializer(read_only = True)

class Meta:
    model = get_user_model()
    fields = [
        'email',
        'username',
        'password',
        'profile'
    ]

    extra_kwargs = {
'password': {'write_only': True},
}

def create(self, validated_data):
    user_password = validated_data.pop('password')
    user = get_user_model()(
    email = validated_data['email'],
    username = validated_data['username']
    )
    user.set_password(user_password)
    user.save()

    user.email_user("Hello world")

    return user

注册新用户的端点

@api_view(["POST"]) @permission_classes([AllowAny, ])

定义寄存器(请求): profSerializer = ProfileSerializer(数据 = request.data) 序列化器 = AccountSerializer( 数据 = request.data )

if serializer.is_valid():
    serializer.save()
    serializer.send_mail("Hello")
    return JsonResponse( serializer.data )

else:
    print( serializer.errors )
    return JsonResponse(  { "_err": serializer.errors }  )

当我向注册端点发送发布请求时,我的问题出现了,配置文件字段保持为空,头像字段分配了默认值 default.png。每当用户注册时,我都需要端点来创建用户帐户和个人资料条目

对端点的 post 请求是以下 JSON

{
      email:"some email",
      username:"username",
      password:"password",
      tel:"tel number",
      avatar:"image"
    }

【问题讨论】:

    标签: django-rest-framework


    【解决方案1】:

    在您的AccountSerializer 中,您已将profile 字段设置为只读:

    profile = ProfileSerializer(read_only=True)
    

    这意味着该字段将被忽略并且不会显示在request.data 中。

    那么你需要对你的 create 方法做一点改动,像这样:

    def create(self, validated_data):
        profile_data = validated_data['profile']
    
        # user creation steps
        ...
    
        profile = Profile(
            user=user,
            **profile_data
        )
        profile.save()
    
        return user
    
    

    rest_framework默认不能创建相关对象,所以需要先创建账户实例,然后自己创建Profile

    然后,您不需要在视图中使用 ProfileSerializer 序列化 request.data,删除该行并将请求正文更改为:

    {
        email:"some email",
        username:"username",
        password:"password",
        profile: {
            tel:"tel number",
            avatar:"image"
        }
    }
    

    我建议您了解nested serializers 及其工作原理

    【讨论】:

    • 谢谢,@Ersain,它有效。
    猜你喜欢
    • 1970-01-01
    • 2018-07-14
    • 1970-01-01
    • 2019-02-06
    • 2014-11-03
    • 1970-01-01
    • 1970-01-01
    • 2016-10-03
    • 2016-12-18
    相关资源
    最近更新 更多