Logo
Section 1 / 6

注册序列化器

学习如何创建序列化器以注册自定义用户。

导入

注册序列化器

学习如何创建序列化器以注册自定义用户。

使用 Simple JWT 注册用户的流程包含三个步骤:

  1. 实现序列化器
  2. 实现视图
  3. 实现端点

本课程重点讲解序列化器的实现。

用户注册序列化器

让我们为用户注册创建一个序列化器。
注册序列化器可以理解为负责以下任务的代码模块:

  • 接收创建用户所需的数据集合。
  • 根据所使用的序列化器类(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。

动手实践

在下方代码编辑器中,尝试应用本课所学内容:

  1. 添加必要的导入语句。
  2. 在 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)

课程简介

注册视图