Django-rest-framework 接口实现 ModelSerializer 使用
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},
}