ModelSerializer
三种基本序列化字段方式
from rest_framework import serializers
from goods.models import GoodsInfo
# 定义一些序列号程序
class GoodsInfoSerializer(serializers.ModelSerializer):
# 创建序列化器
class Meta:
# 定义元类
# model指明了当前的序列化器和哪个模型产生联系
model = GoodsInfo
fields = '__all__' # 意思是所有的字段都要
# 这样写是自己选择需要的字段
# fields = ('url', 'username', 'email', 'groups')
class GoodsInfoSer(serializers.ModelSerializer):
class Meta:
#model指明了当前的序列化器产生联系
model = GoodsModel
#下面所有字段都以模型为对应
#fields指明的是需要那些字段
fields = '__all__'
#所需要的字段
fields = ('id','name','pub_date','readcount')
#不需要的字段
exclude = ('is_delete',)
#只读
read_only_field = ()
指定嵌套序列化
用于有外键的数据库,设置depth为整数,通常为1
from user.models import UserInfo
from rest_framework import serializers
class UserAutoSerializers(serializers.ModelSerializer):
class Meta:
model = UserInfo
fields = '__all__'
depth = 1
用shell调试结果为:
>>> from user.serializers import *
>>> ser = UserAutoSerializers()
>>> ser
UserAutoSerializers():
id = IntegerField(label='ID', read_only=True)
name = CharField(max_length=20)
password = CharField(max_length=20, required=False)
phone = CharField(max_length=11)
addkey = NestedSerializer(read_only=True):
id = IntegerField(label='ID', read_only=True)
add = CharField(max_length=50)
>>>
指定字段序列化(覆盖)
class AccountSerializer(serializers.ModelSerializer):
url = serializers.CharField(source='get_absolute_url', read_only=True)
groups = serializers.PrimaryKeyRelatedField(many=True)
class Meta:
model = Account
想要指定readonly字段还有第二个Meta选项,read_only_fields.:
read_only_fields = ('account_name',)
附加关键字参数
还有一个快捷方式,允许您在字段上指定任意附加关键字参数,使用extra_kwargs选择。如在.的情况下read_only_fields,这意味着不需要显式声明序列化程序上的字段。
class Meta:
model = User
fields = ('email', 'username', 'password')
extra_kwargs = {'password': {'write_only': True}}
request和response
request请求
就是HttpRequest的扩展功能
.data:
request.data返回请求主体的解析内容(可以解析各种类型请求包括POST等)。这与标准类似。request.POST和request.FILES属性除外:
它包括所有已解析的内容,包括文件和非文件投入。
它支持解析除HTTP之外的HTTP方法的内容POST,这意味着您可以访问PUT和PATCH请求。
它支持REST框架灵活的请求解析,而不仅仅是支持表单数据。例如,您可以处理传入表单数据的方式处理传入的JSON数据。
.query_params:
相当于request.GET,但是任何HTTP方法类型都可能包含查询参数,而不仅仅是GET请求
response类
数据类型可以是str,list,dict等
class Response(SimpleTemplateResponse):
"""
An HttpResponse that allows its data to be rendered into
arbitrary media types.
"""
def __init__(self, data=None, status=None,
template_name=None, headers=None,
exception=False, content_type=None):
data:为响应准备的序列化之后的数据,status是状态码,template_name模板的名称
headers:响应头信息,content_type:一般不需要指定,框架根据前端传递的信息来指定