03 DRF之ModelSerializer
ModelSerializer和model字段一一对应,不用像Serializer那样手动写每个字段
1、创建Model对应的Serializer
创建Model对应的Serializer,继承serializers.ModelSerializer
class Meta字段:
model:model对应的字段名称
fields:包含的字段名列表,可以用"__all__"包含所有字段,手动写列表可以进行排序
exclude:指定不包含的字段名称,元组形式
depath:指定外键检索深度
2、Choice字段显示文本
在类中添加对应字段,并添加source属性,类似Serializer一样
3、外键返回指定字段
class BookSerializer(serializers.ModelSerializer): category = serializers.CharField(source="get_category_display") publisher = serializers.SerializerMethodField() author = serializers.SerializerMethodField() def get_publisher(self, obj): # ORM的正向查询 publisher_obj = obj.publisher return {"id": publisher_obj.id, "title": publisher_obj.title} def get_author(self, obj): author_query_set = obj.author.all() return [{"id": author_obj.id, "name": author_obj.name} for author_obj in author_query_set] class Meta: model = Book # 指定字段 # fields=['id','title','pub_time'] # 所有字段 fields = "__all__" # 指定不包含的字段 exclude = () # 外键字段查找1层 depath = 1
1、自定义方法字段,字段名就是外键名称
2、创建局部钩子,方法名为get_字段名称,第二个参数obj是一个类对象,如一个book
3、在钩子函数内使用ORM操作,返回所需的字段
4、ModelSerializer反序列化
1、给仅正向序列化的字段重写为方法函数,并创建对应的get_钩子函数
出现了部分不想要的字段,我们添加white_only应该就可以
2、不要已经用方法函数重写过的字段,如上截图
write_only字段没有了