DRF框架的使用入门(三)ModelSerializer和各类View详解
前文:推荐看官网
环境:版本(django1.11, python3.5),适用于前后端分离项目
详解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')
除了之前两中设置字段对应之外还有第三种:
exclude设置为要从序列化程序中排除的字段列表。
# 不需要写fields
model = GoodsInfo
exclude = ('is_delete',) # 意思是除了这个字段都包含
指定嵌套序列化
用于有外键的数据库,设置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