本系列文章中的上一篇文章:序列化和反序列化
# 定义序列化器
# 一个序列化类是针对某个模型(数据库表)进行设计的
# class BookSerializer(serializers.Serializer):
# # 这些字段对应着数据库表的字段和类型
# # CharField、IntegerField、DateField 在反序列化的时候校验数据用的
# # 比如 title 要求是字符串,且长度要求不超过 32 位
# title = serializers.CharField(max_length=32)
# price = serializers.IntegerField()
# # pub_date = serializers.DateField()
# # 如果想序列化后的键的名字自定义
# # 则要指定 source="pub_date" 参数,对应数据库里的字段名
# date = serializers.DateField(source="pub_date")
#
# # 重写父类中的 create 方法,实现自己的数据保存逻辑
# # create 方法需要返回值,因为在源码中 save 方法需要接收 create 方法的返回值
# def create(self, validated_data):
# new_book = Book.objects.create(**validated_data)
#
# return new_book
#
# # 重写父类中的 update 方法,实现更新数据逻辑
# # update 方法需要返回值,因为在源码中 save 方法需要接收 create 方法的返回值
# def update(self, instance, validated_data):
# Book.objects.filter(pk=instance.pk).update(**validated_data)
# update_book = Book.objects.get(pk=instance.pk)
#
# return update_book
# 继承序列化器中的 ModelSerializer 类,只需要在类 Meta 中指定数据库模型,即 models = Book
# 就可以完成上述的所有手动功能
# 比如创建数据库表字段,创建 create 和 update 方法等
class BookSerializer(serializers.ModelSerializer):
# 自定义字段(给数据库字段起别名)
date = serializers.DateField(source="pub_date")
class Meta:
model = Book
# fields = "__all__" # 针对所有的数据库字段进行序列化
# fields = ["title", "price"] # 针对列表里的字段进行序列化
# 排除 pub_date 字段,而是对其他字段进行序列化
# 之所以要排除,是因为和上面自定义的 date 字段重复了
exclude = ["pub_date"]