简体   繁体   English

使用 Djoser Django Rest 对用户进行序列化和反序列化

[英]Serializing and Deserialzing User using Djoser Django Rest

I am quiet new to django and i am using djoser to create a user.我对 django 很陌生,我正在使用 djoser 创建用户。 I have custom user Model and Custom User Serializer.我有自定义用户 Model 和自定义用户序列化器。 My Custom User is following.我的自定义用户正在关注。

class User(AbstractBaseUser, PermissionsMixin):
    """
    A fully featured User model with admin-compliant permissions that uses
    a full-length email field as the username.

    Email and password are required. Other fields are optional.
    """
    email = models.EmailField(_('email address'), max_length=254, unique=True)
    first_name = models.CharField(_('first name'), max_length=30, blank=True)
    middle_name = models.CharField(_('middle name'), max_length=30, blank=True)
    last_name = models.CharField(_('last name'), max_length=30, blank=True)
    is_staff = models.BooleanField(_('staff status'), default=False,
                                   help_text=_('Designates whether the user can log into this admin '
                                               'site.'))
    is_active = models.BooleanField(_('active'), default=True,
                                    help_text=_('Designates whether this user should be treated as '
                                                'active. Unselect this instead of deleting accounts.'))
    extra_field = models.BooleanField(_('changethis'), default=False,
                                      help_text=_('Describes whether the user is changethis '
                                                  'site.'))
    date_joined = models.DateTimeField(_('date joined'), default=timezone.now)

    username = models.CharField(_('username'), max_length=30, blank=True)

    roles = models.ManyToManyField(Role, related_name='role_user')

    objects = CustomUserManager()

and following is my CustomUserManager()以下是我的 CustomUserManager()

class CustomUserManager(BaseUserManager):
    def _create_user(self, email, password,
                     is_staff, is_superuser, **extra_fields):
        now = timezone.now()
        if not email:
            raise ValueError('The given email must be set')
        email = self.normalize_email(email)
        user = self.model(email=email,
                          is_staff=is_staff, is_active=True,
                          is_superuser=is_superuser, last_login=now,
                          date_joined=now, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_user(self, email, password=None, **extra_fields):
        return self._create_user(email, password, False, False,
                                 **extra_fields)

    def create_superuser(self, email, password, **extra_fields):
        return self._create_user(email, password, True, True,
                                 **extra_fields)

And following is my serializer code.以下是我的序列化程序代码。

class RegisterSerializer(serializers.Serializer):
    email = serializers.EmailField(required=allauth_settings.EMAIL_REQUIRED)
    first_name = serializers.CharField(required=True)
    middle_name = serializers.CharField(required=False)
    last_name = serializers.CharField(required=True)
    password = serializers.CharField(required=True, write_only=True)
    roles = serializers.ListSerializer(child=serializers.IntegerField())

    # def create(self, validated_data):
    def create(self, validated_data):
        roles_ids = validated_data.pop('roles')
        roles = Role.objects.filter(id__in=roles_ids)
        user = User.objects.create_user(**validated_data)
        user.roles.set(roles)
        return user

Since the Roles objects are already created so i just take a list of ids of roles from request and filter these objects of roles and set them for the respective user.由于已经创建了角色对象,所以我只需从请求中获取角色 ID 列表,然后过滤这些角色对象并为各自的用户设置它们。 Now the user is being created just fine but when djoser tries to return response using same serializer it throws following exception.现在用户创建得很好,但是当 djoser 尝试使用相同的序列化程序返回响应时,它会引发以下异常。

TypeError: int() argument must be a string, a bytes-like object or a number, not 'Role' TypeError: int() 参数必须是一个字符串,一个类似字节的 object 或一个数字,而不是“角色”

because roles are supposed to be list of integers not List of Role Objects.因为角色应该是整数列表而不是角色对象列表。 How can i fix it?我该如何解决?

Change this改变这个

roles = serializers.ListSerializer(child=serializers.IntegerField())

to

roles = serializers.ListField(child=serializers.IntegerField())

Or,或者,

If you want to list all roles then create a new serializer for roles and add it to child like:如果要列出所有角色,则为roles创建一个新的序列化程序并将其添加到子项中,例如:

roles = serializers.ListSerializer(child=RolesSerializer())

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 使用Djoser和Django Rest Framework注册用户时传递其他数据 - Pass additional data while registering user using Djoser and Django Rest Framework 如何在 Django REST 框架中使用 Djoser 设置用户注册的特殊权限? - How to set special permission on user registration using Djoser in Django REST Framework? Django REST 框架 / djoser - 自定义用户身份验证 model - Django REST Framework / djoser - authentication in custom user model Djoser / Django Rest Framework /用户注册:如何存储非必需的用户字段 - Djoser / Django Rest Framework / User Registration: How to store non required user fields Django Rest Framework - 使用 Djoser “无法创建帐户” - Django Rest Framework - "Unable to create account" with Djoser Django Rest Framework djoser 激活问题 - Django Rest Framework djoser activation problem 使用 Djoser 和 Django Rest Framework 激活帐户 - Accounts activation with Djoser and Django Rest Framework 具有djoser令牌认证的Django rest框架检索用户first_name - Django rest framework with djoser token authentication retrieve user first_name DJANGO REST + DJOSER /api/auth/users/activation get invalid user or token wrong 错误 - DJANGO REST + DJOSER /api/auth/users/activation get invalid user or token wrong error Django多对多,使用REST进行排序和序列化 - Django Many to Many, ordering and serializing using REST
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM