这里使用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插件 markdown

使用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/