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
View Code

1、自定义方法字段,字段名就是外键名称

2、创建局部钩子,方法名为get_字段名称,第二个参数obj是一个类对象,如一个book

3、在钩子函数内使用ORM操作,返回所需的字段

4、ModelSerializer反序列化

   1、给仅正向序列化的字段重写为方法函数,并创建对应的get_钩子函数

出现了部分不想要的字段,我们添加white_only应该就可以

    

2、不要已经用方法函数重写过的字段,如上截图

write_only字段没有了

 

posted @ 2019-06-24 17:42  丫丫625202  阅读(208)  评论(0编辑  收藏  举报