drf中的请求和响应-可浏览API-常用序列化字段
drf中的请求和响应
请求对象
REST框架引入了一个扩展了常规HttpRequest
的请求对象, 并提供更灵活的请求解析。请求对象的核心功能是属性request.data
,这与request.POST
类似,但对于WebAPIs更有用。
request.POST # Only handles form data. Only works for 'POST' method.
request.data # Handles arbitrary data. Works for 'POST', 'PUT' and 'PATCH' methods.
响应对象
REST framework还引入了一个响应对象,这是一种TemplateResponse
类型,它接受未渲染的内容,并使用内容协商来确定返回给客户端的正确内容类型。
return Response(data) # Renders to content type as requested by the client.
状态码
在视图中使用数字HTTP状态码并不总是容易读懂,而且当使用了错误的状态码还不容易发现。REST框架为每个状态代码提供了更显式的标识符, 比如status
模块中的HTTP_400_BAD_REQUEST
。
视图包装器
REST框架提供了两个包装器,您可以使用它们来编写API视图。
@api_view
用来装饰基本的函数视图。APIview
类用来创建类视图。
这些包装器提供了一些功能,比如确保在视图中接收到请求实例,并向响应对象添加上下文,以便可以执行内容协商。
包装器还提供了一些行为,比如在适当的时候返回405 Method Not Allowed
响应,以及处理当request.data
输入不正确数据时发生的任何ParseError异常。
可浏览API
为url添加可选的格式后缀
-
修改视图
- 在视图函数里加关键字参数format
-
修改路由
- 在路由中添加格式
-
然后我们就可以通过添加格式后缀来获取不同的内容:
/students.json # 返回的就是json数据
/students.api # 可浏览的api模式,html
- 还可以通过
accept
来控制响应的格式:
accept:application/json # request json
accept:text/html # request html
常用序列化器字段
序列化器字段处理基元值和内部数据类型之间的转换。它们还处理输入值的验证,以及从它们的父对象检索和设置值。
核心参数
每个序列化器字段类构造函数至少接受这些参数。一些字段类还接受额外的,字段特定的参数,但以下应参数应该一直被接受:
read_only
字段只读,默认值为False
。只读字段只会包含在序列化输出中,创建修改对象时不会包含该字段,即使输入了也会被忽略。
write_only
字段只写,默认值为False
。和read_only
相反,序列化时不包含,创建修改对象时必须包含该字段。
required
字段必须,默认值为True。必须字段在创建修改对象时必须包含,否则抛出异常。当设置为False时,在创建修改对象时可以不用包含该字段。
default
默认值。如果一个字段设置了默认值,那么在反序列化时,如果没有提供该字段,则使用默认值进行填充。
在进行局部更新时,default
不会应用。因为局部更新时,只有更新的字段会被校验和返回。
还可以设置一个函数或者一个可调用对象,
可以设置为一个函数或其他可调用对象,在这种情况下,会使用调用后的结果进行填充。调用时,它将不接收任何参数。如果可调用对象有一个requires_context = True
的属性,那么序列化字段会被当做参数传入。例如:
class CurrentUserDefault:
"""
May be applied as a `default=...` value on a serializer field.
Returns the current user.
"""
requires_context = True
def __call__(self, serializer_field):
return serializer_field.context['request'].user
在序列化实例时,如果实例中不存在对象属性或字典键,将使用default的值填充。
注意,设置默认值意味着该字段不是必需的。同时包含默认和必需的关键字参数是无效的,将引发错误。
allow_null
通常,如果将None传递给序列化器字段,将引发错误。如果None应该被认为是一个有效值,则将该关键字参数设置为True。
注意,如果没有显式的默认值,将该参数设置为True将意味着序列化输出的默认值为None,但这并不意味着输入反序列化是默认的。
默认值为False
source
将用于填充字段的属性的名称。可以是一个只接受self参数的方法, 比如URLField(source='get_absolute_url')
,或者是一个句点法的属性,比如CharField(source='channel.name')
。
当使用句点法序列化字段时,如果在属性遍历期间没有任何对象或为空,则可能需要提供一个默认值。
默认值为字段的名称。
validators
应该应用到输入字段的验证器函数的列表,它要么引发验证错误,要么简单地返回。验证器函数通常应该引发serializers.ValidationError
,但Django内置的ValidationError
也被支持,以便与Django或第三方Django包中定义的验证器兼容。
error_messages
错误消息字典。
label
一个短文本字符串,可以用作HTML表单字段或其他描述性元素中的字段名。
help_text
可以在HTML表单字段或其他描述性元素中用作字段描述的文本字符串。
CharField
文本字段,可以验证文本小于max_length
大于min_length
RegexField
文本字段,可以验证文本是否匹配给定正则表达式。
IntergerField
整数字段,可以验证整数小于max_value
,大于min_value
FloatField
实数字段,可以验证整数小于max_value
,大于max_value
DecimalField
以十进制表示Python中由decimal的实例。
更多详解官方文档:https://www.django-rest-framework.org/api-guide/fields/#serializer-fields
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)