一: rest_framework 中 serializers.Serializer的不方便之处(以下简称Serializer)
a:需要定义每一个字段,并且这个字段是和models字段及其类似。
b:和froms是不是很像,有没有类似ModelFroms类似的模块,简化字段的编写,当然有ModelSerializer就是这中类型
二:ModelSerializer序列化
a:view中的文件不需要修改
b:重新编写BookSerializers继承serializers.ModelSerializer
--model 指定哪一个model
--fields 表示需要序列化的字段,"__all__"全部字段
--depth 向下查找一层。指对外键关系会继续遍历外键对象的全部属性。(但是如果外键表字段过多,而前端需要的字段并不是很多,使用起来会不方便。所以常常不用)
?
1
2
3
4
5
6
7
|
class BookSerializers(serializers.ModelSerializer):
class Meta:
model = Book
# fields=['title','category','publisher','authon'] #可以对字段进行排序
fields = "__all__" #所有的字段,但是无序
depth = 1 #向下查找一层
|
c:对部分字段,如外键,choices字段,进行自定义序列化
--需要结合反序列化一起使用
+?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
class BookSerializers(serializers.ModelSerializer):
#部分字段自定义 字段定义后 fields字段一定要展现
category_display = serializers.CharField(source = "get_category_display" ,read_only = True )
##处理一对多关系 调用SerializerMethodField()方法
publisher_id = serializers.SerializerMethodField(read_only = True )
def get_publisher_id( self ,obj):
publisher_obj = obj.publisher
return { "id" :publisher_obj. id , "title" :publisher_obj.title}
#处理多对多
authons = serializers.SerializerMethodField(read_only = True )
def get_authons( self ,obj):
authon_query_list = obj.authon. all ()
return [{ "id" :authon_query. id , "name" :authon_query.name} for authon_query in authon_query_list]
class Meta:
model = Book
# fields=['title','category','publisher','authon'] #可以对字段进行排序
fields = "__all__" #所有的字段,但是无序
#depth=1 #向下查找一层
|
三:ModelSerializer反序列化
--extra_kwargs字段设置对应的字段反序列化
--提交的数据,和models字段一样。外键关系传递id即可
--会自动添加数据
?
1
2
3
4
5
6
7
8
9
10
11
12
|
class Meta:
model = Book
# fields=['title','category','publisher','authon'] #可以对字段进行排序
fields = "__all__" #所有的字段,但是无序
#设置反序列化的字段 write_only
extra_kwargs = {
'category' :{ 'write_only' : True },
'publisher' : { 'write_only' : True },
'authon' : { 'write_only' : True },
}
|
四:路由分发注意点
a:path('retrieve/<int:pk>',views.BookEditView.as_view()) #id修改成pk
五:序列化小结
DRF序列化和反序列化(二:ModelSerializer)的相关教程结束。