这里使用CBV (class based views)使用类来处理业务逻辑编写view视图 ,以json dumps序列化做铺垫引出serialize序列化的长处
使用python的dumps方法序列化博客列表
编写apps/blogs的views.py
python
import json
from django.http import HttpResponse
from django.views.generic.base import View
from .models import Article
class ArticleListView(View):
def geta(self, request):
"""通过django的View实现文章列表的json数据返回"""
json_list = []
articles = Article.objects.all()[:10]
for article in articles:
art_dict = dict()
art_dict['title'] = article.title
art_dict['cover'] = article.cover
art_dict['click_num'] = article.click_num
json_list.append(art_dict)
json_str = json.dumps(json_list)
return HttpResponse(json_str, content_type='application/json')
编写LehuXuexi下的urls.py,加上路由
python
from blogs.views import ArticleListView
urlpatterns = [
...,
...,
path('articles/', ArticleListView.as_view(), name='article-list')
]
接下来运行,项目打开 http://localhost:8000/articles/
,但发生报错提示json无法序列化cover字段,这说明了json dumps序列化的局限性,报错如下
python
TypeError at /articles/
<ImageFieldFile: blogs/articles/covers/2.jpg> is not JSON serializable
...
...
那先把views.py的art_dict['cover'] = article.cover注释掉,刷新下页面发现可以了。如果想在浏览器直观的看json可以安装jsonview插件
使用django的serialize方法序列化博客列表
重新编写views.py
python
from django.core.serializers import serialize
from django.http import HttpResponse
from django.views.generic.base import View
from .models import Article
class ArticleListView(View):
def get(self, request):
articles = Article.objects.all()[:10]
json_str = serialize('json', articles)
return HttpResponse(json_str, content_type='application/json')
刷新浏览器后展示,以下为返回的部分json数据
python
[
{
model: "blogs.article",
pk: 1,
fields: {
category: 3,
user: 1,
title: "中国父亲,亟待走出“舒适区”",
brief: "别人当他敌人,他却又当敌人是朋友,他永远坚持自己的信条,但在处理具体事物时,又不乏灵活的手腕。",
cover: "blogs/articles/covers/2.jpg",
content: "<div class...",
click_num: 100,
favor_num: 63,
comment_num: 97,
add_time: "2020-01-05T16:23:00.417",
tags: [ ]
}
},
...,
...
]
相比较json dumps的序列化,serialize代码更加简洁不用每个字段进行命名创建,也能对所有字段支持序列化。但serialize也有缺点,比如cover字段路径缺少settings.py配好的media这一层,pk字段也没放到fields里面,json分层太多等,而django rest framework提供了更好的序列化方法。
版权声明:如无特殊说明,文章均为本站原创,转载请注明出处
本文链接:http://zhangyanc.club/subject/article/django-dumps/
许可协议:署名-非商业性使用 4.0 国际许可协议