注册序列化器
学习如何创建序列化器以注册自定义用户。
使用 Simple JWT 注册用户的流程包含三个步骤:
- 实现序列化器
- 实现视图
- 实现端点
本课程重点讲解序列化器的实现。
用户注册序列化器
让我们为用户注册创建一个序列化器。
注册序列化器可以理解为负责以下任务的代码模块:
- 接收创建用户所需的数据集合。
- 根据所使用的序列化器类(
ModelSerializer或Serializer)自动或手动验证数据。 - 保存用户对象实例。
- 将对象转换为可存储到数据库中的数据流(序列化)。
- 在创建用户对象后,将从数据库返回的数据反序列化为可用格式。
验证过程包括检查:
- 每个用户输入的数据类型是否与模型中定义的一致。
- 字段的约束条件。
验证通过后,有效数据会被传递给内置的 create() 或 update() 方法,分别用于创建或更新模型实例。在我们的场景中,仅需在 第14行 使用 create() 方法,因为我们是用数据创建新的用户实例。
这体现了序列化器与 Django Forms 类的相似性。我们还可以进一步将 Form 和 ModelForm 类的工作机制与 Django REST framework 的 Serializer 和 ModelSerializer 进行对比。
在下面的 第6行 中,RegistrationSerializer 使用了 ModelSerializer 类进行序列化。ModelSerializer 类具有三大优势:
- 自动将序列化字段映射到模型字段,而
Serializer需要显式声明所有字段。 - 自动验证生成的字段。
- 内置
.create和.update方法,实现更简单。
现在,我们在 serializers.py 中创建 RegistrationSerializer 类。
1from rest_framework import serializers 2from django.contrib.auth import get_user_model 3 4User = get_user_model() 5 6class RegistrationSerializer(serializers.ModelSerializer): 7 password = serializers.CharField( 8 max_length=68, min_length=8, write_only=True) 9 10 class Meta: 11 model = User 12 fields = ['email', 'password'] 13 14 def create(self, validated_data): 15 return User.objects.create_user(**validated_data)
在上述 RegistrationSerializer 中:
- 第4行 的
User变量存储了通过get_user_model()获取的自定义用户模型,使我们可以在序列化器中使用它。 - 第7行 的序列化器
password字段对User模型的password字段进行了定制,增强了安全性:限制密码长度在 8 到 68 个字符之间,并设置write_only=True,防止密码被读取。 - 第10–12行 的
Meta类将序列化器与User模型关联起来,并指定模型字段到序列化器字段的映射属性。 - 第14行 的
create()是内置方法,利用序列化器验证后的数据创建User对象。
我们没有将 User 模型中的其他字段添加到 RegistrationSerializer,因为这些字段都有默认值。我们可以在每个字段的括号中看到其默认值:
1 is_verified = models.BooleanField(default=False) 2 is_active = models.BooleanField(default=False) 3 is_staff = models.BooleanField(default=False) 4 created_at = models.DateTimeField(auto_now_add=True)
因此,当我们提供邮箱并设置密码时,其余字段会自动处理。如果希望映射所有字段而非仅邮箱字段,则可在 Meta 类的 fields 中使用 __all__ 参数。
注意:
all两侧各有两个下划线。
1 class Meta: 2 model = User 3 fields = '__all__'
这样,在用户注册 API 请求中就可以为其他字段提供值。但根据当前配置,创建用户只需提供邮箱和密码即可。
用户需要激活链接来启用登录功能,即把 is_active 和 is_verified 状态设为 True。
注意:用户注册时,
is_active和is_verified状态默认为False。
动手实践
在下方代码编辑器中,尝试应用本课所学内容:
- 添加必要的导入语句。
- 在
serializers.py中创建用户注册序列化器。
No configuration found for ID: 4d39bbfc1ea8ecbb7b051d6c3af8c01e302282b16c042efe6834b8dd24056a55
目前我们只实现了用户注册序列化器,因此上述代码不会产生输出。
请在 serializers.py 中编写以下代码:
1from rest_framework import serializers 2from django.contrib.auth import get_user_model 3 4User = get_user_model() 5 6class RegistrationSerializer(serializers.ModelSerializer): 7 password = serializers.CharField( 8 max_length=68, min_length=8, write_only=True) 9 10 class Meta: 11 model = User 12 fields = ['email', 'password'] 13 14 def create(self, validated_data): 15 return User.objects.create_user(**validated_data)
请在 serializers.py 中编写以下代码:
1from rest_framework import serializers 2from django.contrib.auth import get_user_model 3User = get_user_model() 4class RegistrationSerializer(serializers.ModelSerializer): 5password = serializers.CharField( 6max_length=68, min_length=8, write_only=True) 7class Meta: 8 model = User 9 fields = ['email', 'password'] 10 11def create(self, validated_data): 12 return User.objects.create_user(**validated_data)