前面学习Serializers用法时,发现所有的序列化都与我们的模型紧密相关。
django_restframework也给我提供了跟模型紧密相关的序列化器——ModelSerializer。
它会根据模型自动生成一组字段;它简单的默认实现了.update()以及.create()方法。
一、ModelSerializer序列化
1、定义ModelSerializer序列化器
# 针对models设计和声明序列化类 from rest_framework import serializers from .models import Book, Publisher class BookSerializer(serializers.ModelSerializer): class Meta: model = Book # 与Book表对应 # 这三种情况不能同时使用 # 1.取全部字段 fields = "__all__" # 2.自定义包含字段 # fields = ["id", "title", "pub_time"] # 输出:[{"id": 1, "title": "python开发", "pub_time": "2011-08-27"},...] # 3.排除某些字段 # exclude = ["id", "category","author", "publisher"] # 输出:[{"title": "python开发", "pub_time": "2011-08-27"},...]
需要注意的是:取全部字段、取自定义字段、排除某些字段这三种筛选不能同时使用。
2、外键关系的序列化
注意:当序列化类META定义了depth时,这个序列化类中引用字段(外键)则自动变为只读。
depth 代表找嵌套关系的第几层。
class BookSerializer(serializers.ModelSerializer): class Meta: model = Book # 与Book表对应 fields = "__all__" depth = 1
添加depth前,显示效果:
添加depth后,显示效果:
由上图可知,只会查看嵌套深度一层的内容。
3、自定义字段
很多字段默认显示的是选择的key值,但要给用户展示的是value值。
因此可以声明一些字段来覆盖默认字段来进行自定制。
class BookSerializer(serializers.ModelSerializer): category = serializers.CharField(source="get_category_display") # 找到对应中文 class Meta: model = Book # 与Book表对应 fields = "__all__"
显示效果如下所示: