rest_framework(5)ModelSerializer 的使用

本系列文章中的上一篇文章:序列化和反序列化

使用 ModelSerializer 对上一篇文章中的 BookSerializer 类进行修改

# 定义序列化器
# 一个序列化类是针对某个模型(数据库表)进行设计的
# 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"]

你可能感兴趣的:(python,django,restful)