ModelSerializer 使用
- 不需要单独写字段的 序列化工具类 相当于 ModelForm
写法:以及 注意事项:
继承
serializers.ModelSerializer
在类中填写 class Meta: 指定数据
model=models.Books
指定表fields = '__all__'
指定字段depth = 1
# 所有有关系的字段都变成 read_only 一般不使用exclude = []
# 排除某个字段extra_kwargs = { }
# 每个字段的一些额外参数'booksType': {'write_only': True},
对于特殊字段的 显示
- 定义字段以及字段对应的方法
- 字段名对应models 中的字段名 也可以不对应 只针对于特殊 显示 多选 外键 多对多
- 指定为
serializers.SerializerMethodField(read_only=True)
的字段类型 SerializerMethodField
会自动去找 get_字段名 的方法执行- 方法定义 方法名要加上
get_
的前缀def get_booksType_info(self, book_obj):
- book_obj 就是当前别序列化的对象
方法中:
'''处理choices 字段''' 同样返回 对象的 choices字段 显示方法
get_字段名_display
return book_obj.get_booksType_display()
'''处理 foreignkey 字段''' 调用 外键对应的 Serializer序列化类 参数传递 当前处理的 对象的 外键字段
return PublisherSerializer(book_obj.publisher).data
使用.data
来获取被序列化的 内容并返回'''处理 manytomany 字段''' 调用 外键对应的 Serializer序列化类 参数传递当前对象的多对多字段 用
all()
取出对应的 所有 内容 并给出 many=true 的参数进行循环 操作 因为对应的 事多条内容.data
取出序列化的内容 并返回return AuthorSerializer(book_obj.authors.all(),many=True).data
特殊字段的展示
- 对于页面中 原值字段的 显示问题 在Meta: 中 设置额外的字段来进行设置 设置为只能写入
class AuthorSerializer(serializers.Serializer): id = serializers.IntegerField(required=False) name = serializers.CharField(max_length=32)class PublisherSerializer(serializers.Serializer): id = serializers.IntegerField(required=False) name = serializers.CharField(max_length=32)class BooksModelSerializer(serializers.ModelSerializer): '''相当于 modelForm''' # SerializerMethodField 会自动去找 get_字段名 的方法执行 # booksType_info = serializers.SerializerMethodField(read_only=True) # 简化写法 如果返回值是一行 可以不用写函数 根据 获取的 内容选择 字段 booksType = serializers.CharField(source='get_booksType_display') publisher_info = serializers.SerialinmnnnnnnnnzerMethodField(read_only=True) authors_info = serializers.SerializerMethodField(read_only=True) def get_booksType_info(self, book_obj): '''处理choices 字段''' # obj 就是当前被序列化的对象 return book_obj.get_booksType_display() def get_publisher_info(self, book_obj): '''处理 foreignkey 字段''' # book_obj.publisher ==> 得到和我这本书关联的出版社对象 return PublisherSerializer(book_obj.publisher).data def get_authors_info(self, book_obj): '''处理 manytomany 字段''' print(book_obj) return AuthorSerializer(book_obj.authors.all(),many=True).data class Meta: model = models.Books fields = '__all__' # depth = 1 # 所有有关系的字段都变成 read_only # exclude = [] # 排除某个字段 extra_kwargs = { # 每个字段的一些额外参数 'booksType': {'write_only': True}, 'publisher': {'write_only': True}, 'authors': {'write_only': True}, }