一.为什么要返回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. Entity Framework --Entity SQL注意事项

    Entity SQL 是 ADO.NET 实体框架 提供的 SQL 类语言,用于支持 实体数据模型 (EDM).Entity SQL 可用于对象查询和使用 EntityClient 提供程序执行的查询 ...

  2. python3爬虫03(find_all用法等)

    #read1.html文件# <html><head><title>The Dormouse's story</title></head># ...

  3. 使用Window Media Player网页播放器

    近段时间在做一个IETM的项目,项目需要使用WebBrower对包含avi的xml进行显示,可avi的显示总是有问题,网上找到这段在html中播放avi的代码,在Win10上表现不错,明天上班用Win ...

  4. OpenLayers学习笔记2——坐标转换问题

    参照别人的添加marker的demo来改造时,发现无论怎样更改经纬度,都是停留在同一个位置.过了一两天突然想起可能是坐标参考的问题,尝试搜了一下,果然是这个问题.问题是这样子的: WMTS中地图的坐标 ...

  5. 同余问题(一)——扩展欧几里得exgcd

    前言 扩展欧几里得算法是一个很好的解决同余问题的算法,非常实用. 欧几里得算法 简介 欧几里得算法,又称辗转相除法. 主要用途 求最大公因数\(gcd\). 公式 \(gcd(a,b)=gcd(b,a ...

  6. Java代码工具箱之解析单行单列简单Excel

    1. 使用开源工具 jxl.jar 2. 功能:解析常规Excel.xls格式测试可行,xlsx未测试.Excel测试格式为常规类似table这种简单布局文件.第一行为标题,后面行为内容.代码 可正确 ...

  7. cf519C. A and B and Team Training(找规律)

    题意 $a$个学生,$b$个教练 可以两个学生和一个教练一组,也可以两个教练和一个学生一组,问最多组成多少组 Sol 发题解的目的是为了纪念一下自己的错误思路 刚开始想的是:贪心的选,让少的跟多的分在 ...

  8. "mysql"."innodb_table_stats" not found 故障解决

    故障描述 "mysql"."innodb_table_stats" 表不存在 "mysql"."innodb_index_stat ...

  9. MySQL - DELETE 多表联合条件删除

    DELETE t0 FROM t_demo t0, t_user u WHERE t0.id = 6 AND t0.id = u.id

  10. pytthon + Selenium+chrome linux 部署

    1,centos7 安装 google-chrome (1) 添加chrome的repo源 vi /etc/yum.repos.d/google.repo [google] name=Google-x ...