Zhonghui

每个不曾起舞的日子,都是对生命的辜负

User Tools

Site Tools


程序:django:serializers

Serializers

序列化器


Serializer

在这里查看 Serializer 在数据库的ORM中的位置

ModelSerializer

和 Model 绑定的 Serializer,基本的工作流程和普通的 Serializer 还是一样的

要注意的是:一个 Model 的 ModelSerializer 是可以有很多个的,按需创建即可

特定字段的行为

# 在 Meta 里写 fields 只是指定“哪些字段要暴露/序列化”,但不改变字段的默认行为。
# 如果我们要为某个字段添加额外的验证器、显示规则、write_only、read_only 等,就需要单独在类属性里重新定义该字段。
 
class RegisterSerializer(serializers.ModelSerializer):
    username = serializers.CharField(
        validators=[UniqueValidator(queryset=User.objects.all(), message="用户名已存在")]
    )
    password = serializers.CharField(write_only=True, min_length=8)
 
    class Meta:
        model = User
        fields = ("id", "username", "email", "password")

序列化器字段的只读只写属性

write_only=True
# 我只用你给我的值来写入数据库,但我不会把你返回给别人(典型例子:密码)。
 
read_only=True
# 这个值我只会返回给你看,但你传进来的时候我不会用它(典型例子:用户 ID、创建时间)。

嵌套

数据库的Table是可以嵌套的:关系型数据库的关联表
同理 ModelSerializer 是可能嵌套使用的(嵌套使用容易引起N+1性能问题

HyperlinkedModelSerializer

HyperlinkedModelSerializer:使用 超链接(URL) 来表示与其他对象的关系,外键关联字段(如 ForeignKey, ManyToManyField)会被序列化成关联对象的 URL,而不是主键(ModelSerializer使用主键)

钩子

DRF Serializer 的生命周期钩子

  1. create(self, validated_data)
    1. 作用:当你用 serializer = S(data=…) 并 serializer.is_valid(); serializer.save(),且没有传入 instance 时会调用它
    2. 典型用途:创建数据库对象
  2. update(self, instance, validated_data)
    1. 作用:当你用 serializer = S(instance=obj, data=…) 并 serializer.save() 时调用它
    2. 典型用途:更新已有对象的字段
  3. validate(self, attrs)
    1. 作用:全局校验(跨字段校验)。is_valid() 时调用
    2. 典型用途:比如检查 password 和 password2 是否一致
/var/www/DokuWikiStick/dokuwiki/data/pages/程序/django/serializers.txt · Last modified: 2025/09/16 16:25 by zhonghui