Django-Vue搭建个人博客:超链接与分页
9945 views, 2023/10/16 updated Go to Comments
超链接
目前我们的文章列表是这样的:
> C:\...>http http://127.0.0.1:8000/api/article/
HTTP/1.1 200 OK
...
[
{
"author": {
...
},
"created": "2020-07-03T07:21:49.865414Z",
"id": 6,
"title": "post with user"
},
{
"author": {
...
},
"created": "2020-07-12T09:11:25.688996Z",
"id": 10,
"title": "new test hello!"
},
...
]
通过数据看不出每篇文章的实际 url 地址。虽然包含了文章的 id 号,但 id 和 url 不一定总是关联的。最好 json 数据中直接提供超链接到每篇文章的 url,以后前端用起来就方便了。
实现超链接可以用 DRF 框架提供的 HyperlinkedIdentityField
:
# article/serializers.py
...
class ArticleListSerializer(serializers.ModelSerializer):
# 新增字段,添加超链接
url = serializers.HyperlinkedIdentityField(view_name="article:detail")
...
class Meta:
model = Article
fields = [
# 有了 url 之后,id 就不需要了
'url',
# 'id',
...
]
HyperlinkedIdentityField
是 DRF 框架提供的超链接字段,只需要你在参数里提供路由的名称,它就自动帮你完成动态地址的映射。view_name
是路由的名称,也就是我们在path(... name='xxx')
里的那个 name- 别忘了在序列化器的
fields
列表里加上url
在命令行中重新发个请求:
C:\...>http http://127.0.0.1:8000/api/article/
...
[
{
"author": {
...
},
"created": "2020-07-03T07:21:49.865414Z",
"title": "post with user",
"url": "http://127.0.0.1:8000/api/article/6/"
},
{
"author": {
...
},
"created": "2020-07-12T09:11:25.688996Z",
"title": "new test hello!",
"url": "http://127.0.0.1:8000/api/article/10/"
},
...
]
这样就人性化多了。
DRF 框架还提供了一个专门的超链接序列化器
HyperlinkedModelSerializer
,大体上跟普通序列化器差不多,不同的是默认以超链接来表示关系字段。详情见官方文档。
分页
DRF 框架继承了 Django 方便易用的传统,分页这种常见功能提供了默认实现。
你只需要在 settings.py
里配置一下就行了:
# drf_vue_blog/settings.py
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 2
}
为了测试把每页的文章数量设置到 2。
在命令行发送请求:
C:\...> http http://127.0.0.1:8000/api/article/
HTTP/1.1 200 OK
...
{
"count": 5,
"next": "http://127.0.0.1:8000/api/article/?page=2",
"previous": null,
"results": [
{
"author": {
...
},
"created": "2020-07-03T07:21:49.865414Z",
"title": "post with user",
"url": "http://127.0.0.1:8000/api/article/6/"
},
{
"author": {
...
},
"created": "2020-07-12T09:11:25.688996Z",
"title": "new test hello!",
"url": "http://127.0.0.1:8000/api/article/10/"
}
]
}
DRF 非常聪明的封装了分页相关的元信息:
- count:总页数
- next:下一页的 url
- previous:上一页的 url
实际的数据被放到 results
列表中。
试着获取第二页的数据:
C:\...> http http://127.0.0.1:8000/api/article/?page=2
HTTP/1.1 200 OK
...
{
"count": 5,
"next": "http://127.0.0.1:8000/api/article/?page=3",
"previous": "http://127.0.0.1:8000/api/article/",
"results": [
{
"author": {
...
},
"created": "2020-08-17T07:44:55Z",
"title": "澳门风景探秘",
"url": "http://127.0.0.1:8000/api/article/11/"
},
{
"author": {
...
},
"created": "2020-08-17T07:46:21Z",
"title": "珠海,我的家乡",
"url": "http://127.0.0.1:8000/api/article/12/"
}
]
}
超链接和分页就完成了。代码量非常少,原因就是 DRF 把常用功能都内置了,直接调用就行,很适合快速开发。