![](/img/trans.png)
[英]Pass additional data while registering user using Djoser and Django Rest Framework
[英]Serializing and Deserialzing User using Djoser Django Rest
我對 django 很陌生,我正在使用 djoser 創建用戶。 我有自定義用戶 Model 和自定義用戶序列化器。 我的自定義用戶正在關注。
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()
以下是我的 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)
以下是我的序列化程序代碼。
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
由於已經創建了角色對象,所以我只需從請求中獲取角色 ID 列表,然后過濾這些角色對象並為各自的用戶設置它們。 現在用戶創建得很好,但是當 djoser 嘗試使用相同的序列化程序返回響應時,它會引發以下異常。
TypeError: int() 參數必須是一個字符串,一個類似字節的 object 或一個數字,而不是“角色”
因為角色應該是整數列表而不是角色對象列表。 我該如何解決?
改變這個
roles = serializers.ListSerializer(child=serializers.IntegerField())
至
roles = serializers.ListField(child=serializers.IntegerField())
或者,
如果要列出所有角色,則為roles
創建一個新的序列化程序並將其添加到子項中,例如:
roles = serializers.ListSerializer(child=RolesSerializer())
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.