一.为什么要返回json数据?

一般来说前端要用到从后台返回的数据来渲染页面的时候,这时候后台就需要向前端返回json类型的数据,简单直观便于理解 ,就类似于

{"xxx":{["name":xxx,"age":xxx}],[],[]}

这种格式的数据,那么django是如何返回这种类型的数据的呢?

二. 方法

1.简单好用的values

# 这是用django自带的模型新建的两张表新闻表和新闻标签表,有注释请自行理解,已经往表里存了数据
class News (models.Model):
# 标题
title = models.CharField(max_length=50,null=False)
# 描述
desc=models.CharField(max_length=400,null=False)
# 内容
content=models.TextField()
# 新闻缩略图 url
thumbnail_url=models.URLField()
# 和前面的真删假删一样
is_delete=models.BooleanField(default=True)
# 新闻发布时间 清醒时间和幼稚时间 数据库存进去时候的时间是零时区的UTC 时间,但是取出来的时间可以通过一些方法改变成正常时间
pub_time=models.DateTimeField(auto_now_add=True)
# 外键关联 on_delete=models.SET_NULL 表示如果你删除了作者或者是标签,那么这条新闻的作者或者标签就设置为空
tag=models.ForeignKey('NewsTags',on_delete=models.SET_NULL,null=True)
author=models.ForeignKey('authpro.User',on_delete=models.SET_NULL,null=True)
class Meta:
ordering=['-pub_time'] # 新闻标签表
class NewsTags(models.Model):
name = models.CharField(max_length=20)
## 真删和假删
# 真删 :物理删除 delete() 直接从数据库里删除
# 假删:逻辑删除 update(is_delete=false) , 还在数据库里存着
is_delete=models.BooleanField(default=True)

现在我需要获取全部的新闻,那么我就需要在view里这样写

from .models import News, NewsTags   # 导入两张表
news = News.object.all()
print(news)
# 结果 返回一个queryset 对象
# <QuerySet [<News: News object (14)>, <News: News object (13)>, <News: News object (12)>, <News: News object (11)>]...>
# 然后用到django为我们提供的方法 values
news_list = news.values()
print(news_list)
#得到结果 <QuerySet [{"id":1},{"id":2}]...> 还是一个queryset对象
#然后我们再来用list()方法强制转换一下
entry_list = list(news_list)
print(entry_list)
# 结果 [ {"id":1}, {"id":2} ],这时我们已经得到了我们想要的格式

如果我们想要传单条数据呢,这时候我们就可以去遍历了

for news in entry_list:
print(news)
# 结果 这时的news 就是像{"id":1,"name":xxx} 这样的对象了

但是我们这样还是有问题,我们取到的对象他的外键字段就成了"tag_id":1,"author_id":2,这种形式,这显然不是我们想要的,而我们想要的形式却是"tag":标签名称,"author":作者名 这种的,所以我们就还需要根据id 查询出tag,和autho 所对应的标签名和作者名

tagid = news["tag_id"]
tag = NewTags.object.filter(tagid).first()
tagname=tag.name
news["tag_name"]=tagname
# 这样再次传输的时候就有了,"tag_name":标签名 这样的字段了,作者也是如此

至此,第一种方法values就算完成了,但是劣势我们也看出来了,在当表关系比较复杂的时候,还需要进行查询,比较麻烦,因此这种方法只适用于单表的时候,下面我们来介绍当多表的时候采用的方法。

2. djangoRestFramework

这里是官方链接 djangoRestFramework
用法很简单

1. 在我们项目环境中安装

pip install djangorestframework

2. 注册app

INSTALLED_APPS = [
...
'rest_framework',
]

3.序列化

 
image.png

然后在这个文件里,写我们要序列化的表,和字段就ok了

from rest_framework import serializers   # 要用到的包
from .models import NewsTags, News # 导入这两张表
from app.authpro.serializers import Userserializer # 同样的方法在authpro 这个app下新建Userserializer文件 class Newstagserializer(serializers.ModelSerializer):
class Meta:
model = NewsTags
fields = ("id","name", "is_delete") class Newsserializer(serializers.ModelSerializer): # 继承这个玩意就可以
tag = Newstagserializer() #外键只需要将序列化后的表实例化,这是上面Newstagserializer 的实例
author = Userserializer() # 这是 Userserializer 的实例
class Meta:
#表名
model = News
# 字段名
fields = ("id","title", "desc", "content", "thumbnail_url", "is_delete", "pub_time", "tag", 'author')

4. 使用

#在当前视图中导入
from .serializers import Newsserializer
from django.http import JsonResponse
def news_list(request):
#查数据,和第一种方法查数据的时候一样
news = News.object.all()
# 后台返回数据
serializer = Newsserializer(news,many=True) # 注意多条数据的时候要加many=True
return JsonResponse({“data”:{"news":serialzer.data}})

5. 大功告成,哈哈哈

以上就是django后台向前端两种返回json格式数据的方法。

python学习-- Django REST framework 序列化数据操作的更多相关文章

  1. Django REST Framework序列化器

    Django序列化和json模块的序列化 从数据库中取出数据后,虽然不能直接将queryset和model对象以及datetime类型序列化,但都可以将其转化成可以序列化的类型,再序列化. 功能需求都 ...

  2. [Django REST framework - 序列化组件、source、钩子函数]

    [Django REST framework - 序列化组件.source.钩子函数] 序列化器-Serializer 什么是rest_framework序列化? 在写前后端不分离的项目时: 我们有f ...

  3. Python股票分析系列——基础股票数据操作(一).p3

    该系列视频已经搬运至bilibili: 点击查看 欢迎来到Python for Finance教程系列的第3部分.在本教程中,我们将使用我们的股票数据进一步分解一些基本的数据操作和可视化.我们将要使用 ...

  4. Python学习系列(五)(文件操作及其字典)

    Python学习系列(五)(文件操作及其字典) Python学习系列(四)(列表及其函数) 一.文件操作 1,读文件      在以'r'读模式打开文件以后可以调用read函数一次性将文件内容全部读出 ...

  5. python学习9—文件基本操作与高级操作

    python学习9—文件基本操作与高级操作 1. 文件基本操作 打开文件,获得文件句柄:f = open('filename',encoding='utf-8'),open会查询操作系统的编码方式,并 ...

  6. Django REST framework序列化

    一.简介 Django REST framework是基于Django实现的一个RESTful风格API框架,能够帮助我们快速开发RESTful风格的API. 官网:https://www.djang ...

  7. Python学习日记(十八) 序列化模块

    什么是序列? 就是每一个元素被有序的排成一列 什么是序列化? 就是将原本的列表.字典等内容转化成字符串的过程 什么时候会用到序列化? 数据存储(把数据放在文件.数据库),网络传输等 序列化的目的 1. ...

  8. Django Rest framework序列化流程

    目录 一 什么是序列化 二 Django REST framework配置流程之Serializer 三 Django REST framework配置流程之ModelSerializer 一 什么是 ...

  9. Django 链接MySQL及数据操作

    Django 链接MySQL Django创建的项目自带的数据库是SQLite3,我们想要链接MySQL的话,需要更改settings.py中的配置 1.在MySQL中创建好数据库,Django项目不 ...

随机推荐

  1. SqlServer查询文件组被占用情况

    在SqlServer中,删除一个文件组 alter database [xxxxx] remove filegroup FGMonthTurnIntroduceByMonth13 有时候会遇到如下报错 ...

  2. pta 编程题13 File Transfer

    其它pta数据结构编程题请参见:pta 这道题考察的是union-find并查集. 开始把数组中每个元素初始化为-1,代表没有父节点.为了使树更加平衡,可以让每一个连通分量的树根的负值代表这个连通分量 ...

  3. 使用SAP云平台 + JNDI访问Internet Service

    以Internet Service http://maps.googleapis.com/maps/api/distancematrix/xml?origins=Walldorf&destin ...

  4. 理顺react,flux,redux这些概念的关系

    作者:北溟小鱼hk链接:https://www.zhihu.com/question/47686258/answer/107209140来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转 ...

  5. 【洛谷2279】[HNOI2003] 消防局的设立(贪心)

    点此看题面 大致题意: 给你\(N\)个点(其中\(1\)号点为根),并告诉你编号为\(2\sim N\)的点的父亲(\(fa[i]<i\)),现在要在树上选择尽量少的关键点(消防局),使得任意 ...

  6. mongodb索引 全文索引

    全文索引,也叫文本索引,平时,我们百度的搜索,比如api文档的搜索,这种全局的索引就可以使用全文索引实现 全文索引:对字符串与字符串数组创建全文可搜索对索引 使用情况:比如有一个数据集合,存储了用户的 ...

  7. Python读取图片,并保存为矩阵

    from scipy.misc import imread,imshow img = imread('D:test.bmp') print img[:,:,2].shape imshow() 注意im ...

  8. React后台管理系统-rich-editor组件

    1.Simditor组件的github地址:https://github.com/mycolorway/simditor 网址:http://simditor.tower.im/ 2.在util里边新 ...

  9. 【转】【win网络编程】socket中的recv阻塞和select的用法

    在编写ftp客户端程序时,在联通后使用recv函数进行接收欢迎信息时,需要申请内存进行接收数据保存,一次读取成功,但是由于一个随机的ftp服务端在说,欢迎信息的大小是不知道的,所以在尝试使用死循环,在 ...

  10. MySQL基础 - 1 数据库基础

    一.数据库基础 1.什么是数据库 1.数据库(database)是保存有组织的数据的容器( 通常是一个文件或一组文件 ) 2.数据库是一个以某种有组织的方式存储的数据集合 注意:数据库软件应该称为DB ...