Django rest framework 在序列化程序中重新定义字段

Django rest framework 在序列化程序中重新定义字段,django-rest-framework,Django Rest Framework,我正在学习DRF教程,在那里我遇到了“序列化程序”。几乎所有的事情都很容易理解,除了这个——当你重新定义一个已经在你的连接中的字段时(通过元类中的模型字段) 以下是模型“用户”的序列化程序 class RegistrationSerializer(serializers.ModelSerializer): password = serializers.CharField( max_length = 128, min_length=8, wr

我正在学习DRF教程,在那里我遇到了“序列化程序”。几乎所有的事情都很容易理解,除了这个——当你重新定义一个已经在你的连接中的字段时(通过元类中的模型字段)

以下是模型“用户”的序列化程序

class RegistrationSerializer(serializers.ModelSerializer):
    password = serializers.CharField(
        max_length = 128,
        min_length=8,
        write_only=True 
    )

    token = serializers.CharField(max_length=255, read_only=True)

    class Meta:
        model = User

    def create(self, validated_data):
        return User.objects.create_user(**validated_data)
这里的另一段代码,上面序列化程序的对应模型“User”

class User(AbstractBaseUser, PermissionsMixin):

    username = models.CharField(db_index=True, max_length=255, unique=True)
    email = models.EmailField(db_index=True, unique=True)

    #Here, the password field here!
    password = models.CharField(_('password'), max_length=128)

    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
现在,您可以在本教程中看到,密码已经存在于模型中,但它已在序列化程序中重新定义。。。即使它使用ModelSerializer,它也可以自动导入相应模型中的所有字段


您能解释一下我们这样做的原因吗?

请注意,
User.password
是django模型字段,而
RegistrationSerializer.password
是序列化器字段

从中,本例中序列化程序的目的是将模型转换为“本机Python数据类型,然后可以轻松地呈现为JSON、XML或其他内容类型”。作为一种简化,可以将序列化程序视为定义API上的事物外观,而模型定义数据库接口。serializer字段定义如何转换一个模型字段。如果序列化程序继承自DRF,则DRF将尝试推断如何序列化该模型上尚未在序列化程序类中定义相应序列化程序字段的所有字段。因此,在序列化程序中定义字段并不是重新定义它,而是告诉DRF不要试图推断规范

在这种情况下,
password
serializer字段的定义添加了一个最小长度,并告诉序列化程序该字段将仅写