重新定义序列化器中的字段

时间:2019-01-09 16:14:42

标签: django-rest-framework

我正在关注DRF教程,在那里我遇到了“序列化器”。除了这一点,几乎所有内容都易于理解-当您重新定义已连接的字段时(通过meta类中的model字段)。

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

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,它也可以自动导入相应模型中的所有字段。 / p>

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

1 个答案:

答案 0 :(得分:1)

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

the docs开始,在这种情况下,序列化程序的目的是将模型“转换为本地Python数据类型,然后可以轻松地将其呈现为JSON,XML或其他内容类型”。为了简化起见,可以将序列化器定义为在API上的外观,而模型则定义与数据库的接口。序列化器字段定义如何转换一个模型字段。如果您的序列化程序继承自DRF的ModelSerializer,则DRF会尝试推断如何序列化该模型上尚未在您的序列化程序类中定义相应序列化程序字段的所有字段。因此,在序列化程序中定义字段不会重新定义,而是告诉DRF不要尝试推断规范。

在这种情况下,password序列化器字段的定义会增加一个最小长度,并告诉序列化器该字段仅可写。