定制 Djoser 的序列化器

问题描述 投票:0回答:4

我在 Djoser 中为 user_create 和 current_user 端点创建了两个自定义序列化器。 我还想在用户注册中添加 re_password 字段。但是当我在 Djoser 的设置中添加

"USER_CREATE_PASSWORD_RETYPE": True
时,我的创建用户序列化器不起作用,而默认序列化器起作用。能告诉我问题出在哪里吗?

这是我的序列化器:

from djoser.serializers import UserSerializer as BaseUserSerializer, UserCreateSerializer as BaseUserCreateSerializer

class UserCreateSerializer(BaseUserCreateSerializer):    
    class Meta(BaseUserCreateSerializer.Meta):
        fields = ['id', 'username', 'password', 'email', 'first_name', 'last_name']


class UserSerializer(BaseUserSerializer):
    class Meta(BaseUserSerializer.Meta):
        fields = ['id', 'username', 'email', 'first_name', 'last_name', 'password']

这是 Djoser 的设置:

DJOSER = {
    "USER_CREATE_PASSWORD_RETYPE": True,
    "SERIALIZERS": {
        'user_create': 'core.serializers.UserCreateSerializer',
        'current_user': 'core.serializers.UserSerializer',
    }
}
django django-rest-framework django-serializer djoser
4个回答
1
投票

最后我继承了 UserCreatePasswordRetypeSerializer 而不是 UserCreateSerializer 来同时拥有 re_password 字段和我的自定义序列化器。 我还从设置中删除了

"USER_CREATE_PASSWORD_RETYPE": True
并且它可以正常工作。


0
投票

无需从settings.py 中删除

"USER_CREATE_PASSWORD_RETYPE": True
。您只需要定义新的序列化器

from djoser.serializers import UserCreatePasswordRetypeSerializer

class CustomUserCreatePasswordRetypeSerializer(UserCreatePasswordRetypeSerializer):    
    class Meta(UserCreatePasswordRetypeSerializer.Meta):
        fields = ['id', 'username', 'password', 'email', 'first_name', 'last_name']

并在settings.py中

DJOSER = {
    "SERIALIZERS": {
        'user_create_password_retype': 'core.serializers.CustomUserCreatePasswordRetypeSerializer',
    }
}

因为当

user_create_password_retype
设置为
"USER_CREATE_PASSWORD_RETYPE"
时,它使用
True
序列化器。


0
投票
 from djoser.serializers import UserCreatePasswordRetypeSerializer
    class CustomUserCreatePasswordRetypeSerializer(UserCreatePasswordRetypeSerializer):
        class Meta(UserCreatePasswordRetypeSerializer.Meta):
            fields = ['id', 'username', 'email', 'first_name', 'last_name', 'password']


DJOSER = {
    'PASSWORD_RESET_CONFIRM_URL': '#/password/reset/confirm/{uid}/{token}',
    'USERNAME_RESET_CONFIRM_URL': '#/username/reset/confirm/{uid}/{token}',
    'ACTIVATION_URL': '#/activate/{uid}/{token}',
    'SEND_ACTIVATION_EMAIL': True,

    'USER_CREATE_PASSWORD_RETYPE': True,

    'SERIALIZERS': {
        'user_create': 'core.serializers.UserCreateSerializer',
        'current_user': 'core.serializers.UserSerializer',
        'user_create_password_retype': 'core.serializers.CustomUserCreatePasswordRetypeSerializer',
    },
}

0
投票

这对我有用

设置 Djoser

"SERIALIZERS":{
'user_create':'account.serializers.CustomUserCreateSerializer',
'user':'account.serializers.CustomUserCreateSerializer',
'user_delete': 'djoser.serializers.UserDeleteSerializer',
'user_create_password_retype': 'account.serializers.CustomUserCreateSerializer',
'password_reset': 'account.serializers.PasswordResetEmailSentSerializer',

},

自定义序列化器

from djoser.serializers import SendEmailResetSerializer, UserCreatePasswordRetypeSerializer
from rest_framework import serializers
from account.models import CustomUser


class CustomUserCreateSerializer(UserCreatePasswordRetypeSerializer):
    class Meta(UserCreatePasswordRetypeSerializer.Meta):
        model = CustomUser
        fields =('id','first_name','last_name','email','phone_number','password',)
© www.soinside.com 2019 - 2024. All rights reserved.