一.为什么要返回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. 阿里 EasyExcel 7 行代码优雅地实现 Excel 文件生成&下载功能

    欢迎关注个人微信公众号: 小哈学Java, 文末分享阿里 P8 资深架构师吐血总结的 <Java 核心知识整理&面试.pdf>资源链接!! 个人网站: https://www.ex ...

  2. Jsoup查找dom元素

    package com.open1111.jsoup; import org.apache.http.HttpEntity;import org.apache.http.client.methods. ...

  3. Centos7_Minimal-1611 版安装python3.5.3

    前提 最近在学习python3,看到好多教程都是要求在Windows或者Ubuntu 平台上使用,安装比较方便.由于不在想Winddows上安装也没有Ubutnu系统 ,所以在自己的CentOS7上面 ...

  4. 两数相除赋值整数变量(T-SQL)

    MSSQL: DECLARE @_pagecount INT; ; SELECT @_pagecount; 结果为1 Mysql: BEGIN DECLARE _pagecount INT; ; SE ...

  5. 破解 D-H 协议

    756: 破解 D-H 协议 时间限制: 1 Sec  内存限制: 128 MB提交: 78  解决: 18[提交] [状态] [讨论版] [命题人:admin] 题目描述 Diffie-Hellma ...

  6. GPU && CUDA:主机和设备间数据传输测试

    数据传输测试,先从主机传输到设备,再在设备内传输,再从设备传输到主机. H-->D D-->D D-->H // moveArrays.cu // // demonstrates C ...

  7. PAM认证机制

    PAM:Pluggable Authentication Modules 认证库:文本文件,MySQL,NIS,LDAP等 Sun公司于1995 年开发的一种与认证相关的通用框架机制 PAM 是关注如 ...

  8. 安装配置mysql图文步骤以及配置mysql的环境变量的步骤

    MySQL下载地址:http://dev.mysql.com/downloads/installer/ 我的数据库是5.5.21这个版本的.其实可以一直点击next,直到出现第14张图,从这里开始要注 ...

  9. 九、Shell 流程控制

    Shell 流程控制 和Java.PHP等语言不一样,sh的流程控制不可为空,如(以下为PHP流程控制写法): <?php if (isset($_GET["q"])) { ...

  10. .NET 执行命令行乱码

    Process可以运行命令行内容儿不用担心会弹出命令行窗口 需要读取命令行结果时,如果不注意内容编码,就会出现读取的结果出现乱码 读取StandardOutput结果时需要指定StandardOutp ...