这里使用CBV (class based views)使用类来处理业务逻辑编写view视图 ,以json dumps序列化做铺垫引出serialize序列化的长处
使用python的dumps方法序列化博客列表
编写apps/blogs的views.py
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,加上路由
from blogs.views import ArticleListView urlpatterns = [ ..., ..., path('articles/', ArticleListView.as_view(), name='article-list') ]
接下来运行,项目打开 http://localhost:8000/articles/
,但发生报错提示json无法序列化cover字段,这说明了json dumps序列化的局限性,报错如下
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
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数据
[ { 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://example.com/article/django-dumps/