我们可以声明一些字段来覆盖默认字段,来进行自定制~
比如我们的选择字段,默认显示的是选择的key,我们要给用户展示的是value。
= serializers.CharField(source=,read_only=</span><span style="color: #0000ff;">class</span><span style="color: #000000;"> <a href="/tag/Meta/" target="_blank" class="keywords">Meta</a>:
model </span>=<span style="color: #000000;"> Book
fields </span>= <span style="color: #800000;">"</span><span style="color: #800000;">__all__</span><span style="color: #800000;">"</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> fields = ["id","pub_time"]</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> exclude = ["user"]</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> 分别是所有字段 包含某些字段 排除某些字段</span>
depth = 1</pre>
自定义字段
= serializers.CharField(source=,read_only=</span><span style="color: #0000ff;">class</span><span style="color: #000000;"> <a href="/tag/Meta/" target="_blank" class="keywords">Meta</a>:
model </span>=<span style="color: #000000;"> Book
fields </span>= <span style="color: #800000;">"</span><span style="color: #800000;">__all__</span><span style="color: #800000;">"</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> fields = ["id","pub_time"]</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> exclude = ["user"]</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> 分别是所有字段 包含某些字段 排除某些字段</span>
depth = 1<span style="color: #000000;">
read_only_fields </span>= [<span style="color: #800000;">"</span><span style="color: #800000;">id</span><span style="color: #800000;">"</span><span style="color: #000000;">]
extra_kwargs </span>= {<span style="color: #800000;">"</span><span style="color: #800000;">title</span><span style="color: #800000;">"</span>: {<span style="color: #800000;">"</span><span style="color: #800000;">validators</span><span style="color: #800000;">"</span>: [my_validate,]}}</pre>
Meta中的参数
post以及patch请求
由于depth会让我们外键变成只读,所以我们再定义一个序列化的类,其实只要去掉depth就可以了
= serializers.CharField(source=,"pub_time"]
read_only_fields = [= {: {: [my_validate,]}}
SerializerMethodField
外键关联的对象有很多字段我们是用不到的~都传给前端会有数据冗余~就需要我们自己去定制序列化外键对象的哪些字段~~
= serializers.CharField(source=,read_only===</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> get_user(self,obj):
</span><span style="color: #008000;">#</span><span style="color: #008000;"> obj是当前序列化的book对象</span>
users_query_set =<span style="color: #000000;"> obj.user.all()
</span><span style="color: #0000ff;">return</span> [{<span style="color: #800000;">"</span><span style="color: #800000;">id</span><span style="color: #800000;">"</span>: user_obj.pk,<span style="color: #800000;">"</span><span style="color: #800000;">name</span><span style="color: #800000;">"</span>: user_obj.name} <span style="color: #0000ff;">for</span> user_obj <span style="color: #0000ff;">in</span><span style="color: #000000;"> users_query_set]
</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> get_publisher(self,obj):
publisher_obj </span>=<span style="color: #000000;"> obj.publisher
</span><span style="color: #0000ff;">return</span> {<span style="color: #800000;">"</span><span style="color: #800000;">id</span><span style="color: #800000;">"</span>: publisher_obj.pk,<span style="color: #800000;">"</span><span style="color: #800000;">title</span><span style="color: #800000;">"</span><span style="color: #000000;">: publisher_obj.title}
</span><span style="color: #0000ff;">class</span><span style="color: #000000;"> <a href="/tag/Meta/" target="_blank" class="keywords">Meta</a>:
model </span>=<span style="color: #000000;"> Book
fields </span>= <span style="color: #800000;">"</span><span style="color: #800000;">__all__</span><span style="color: #800000;">"</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> fields = ["id",]}}</pre>
用ModelSerializer改进上面Serializer的完整版
= serializers.SerializerMethodField(read_only== serializers.SerializerMethodField(read_only== serializers.SerializerMethodField(read_only=</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> get_users(self,<span style="color: #800000;">"</span><span style="color: #800000;">name</span><span style="color: #800000;">"</span>: user_obj.name} <span style="color: #0000ff;">for</span> user_obj <span style="color: #0000ff;">in</span><span style="color: #000000;"> users_query_set]
</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> get_publishers(self,<span style="color: #800000;">"</span><span style="color: #800000;">title</span><span style="color: #800000;">"</span><span style="color: #000000;">: publisher_obj.title}
</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> get_dis_chapter(self,obj):
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> obj.get_chapter_display()
</span><span style="color: #0000ff;">class</span><span style="color: #000000;"> <a href="/tag/Meta/" target="_blank" class="keywords">Meta</a>:
model </span>=<span style="color: #000000;"> Book
</span><span style="color: #008000;">#</span><span style="color: #008000;"> fields = "__all__"</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> 字段是有序的</span>
fields = [<span style="color: #800000;">"</span><span style="color: #800000;">id</span><span style="color: #800000;">"</span>,<span style="color: #800000;">"</span><span style="color: #800000;">dis_chapter</span><span style="color: #800000;">"</span>,<span style="color: #800000;">"</span><span style="color: #800000;">publishers</span><span style="color: #800000;">"</span>,<span style="color: #800000;">"</span><span style="color: #800000;">users</span><span style="color: #800000;">"</span>,<span style="color: #800000;">"</span><span style="color: #800000;">user</span><span style="color: #800000;">"</span>,<span style="color: #800000;">"</span><span style="color: #800000;">publisher</span><span style="color: #800000;">"</span><span style="color: #000000;">]
</span><span style="color: #008000;">#</span><span style="color: #008000;"> exclude = ["user"]</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> 分别是所有字段 包含某些字段 排除某些字段</span>
read_only_fields = [<span style="color: #800000;">"</span><span style="color: #800000;">id</span><span style="color: #800000;">"</span>,<span style="color: #800000;">"</span><span style="color: #800000;">publishers</span><span style="color: #800000;">"</span><span style="color: #000000;">]
extra_kwargs </span>= {<span style="color: #800000;">"</span><span style="color: #800000;">title</span><span style="color: #800000;">"</span>: {<span style="color: #800000;">"</span><span style="color: #800000;">validators</span><span style="color: #800000;">"</span>: [my_validate,]},<span style="color: #800000;">"</span><span style="color: #800000;">user</span><span style="color: #800000;">"</span>: {<span style="color: #800000;">"</span><span style="color: #800000;">write_only</span><span style="color: #800000;">"</span>: True},<span style="color: #800000;">"</span><span style="color: #800000;">publisher</span><span style="color: #800000;">"</span>: {<span style="color: #800000;">"</span><span style="color: #800000;">write_only</span><span style="color: #800000;">"</span><span style="color: #000000;">: True},</span><span style="color: #800000;">"</span><span style="color: #800000;">chapter</span><span style="color: #800000;">"</span>: {<span style="color: #800000;">"</span><span style="color: #800000;">write_only</span><span style="color: #800000;">"</span>: True}}</pre>