python学习-- Django REST framework 序列化数据操作
一.为什么要返回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.序列化

然后在这个文件里,写我们要序列化的表,和字段就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 序列化数据操作的更多相关文章
- Django REST Framework序列化器
Django序列化和json模块的序列化 从数据库中取出数据后,虽然不能直接将queryset和model对象以及datetime类型序列化,但都可以将其转化成可以序列化的类型,再序列化. 功能需求都 ...
- [Django REST framework - 序列化组件、source、钩子函数]
[Django REST framework - 序列化组件.source.钩子函数] 序列化器-Serializer 什么是rest_framework序列化? 在写前后端不分离的项目时: 我们有f ...
- Python股票分析系列——基础股票数据操作(一).p3
该系列视频已经搬运至bilibili: 点击查看 欢迎来到Python for Finance教程系列的第3部分.在本教程中,我们将使用我们的股票数据进一步分解一些基本的数据操作和可视化.我们将要使用 ...
- Python学习系列(五)(文件操作及其字典)
Python学习系列(五)(文件操作及其字典) Python学习系列(四)(列表及其函数) 一.文件操作 1,读文件 在以'r'读模式打开文件以后可以调用read函数一次性将文件内容全部读出 ...
- python学习9—文件基本操作与高级操作
python学习9—文件基本操作与高级操作 1. 文件基本操作 打开文件,获得文件句柄:f = open('filename',encoding='utf-8'),open会查询操作系统的编码方式,并 ...
- Django REST framework序列化
一.简介 Django REST framework是基于Django实现的一个RESTful风格API框架,能够帮助我们快速开发RESTful风格的API. 官网:https://www.djang ...
- Python学习日记(十八) 序列化模块
什么是序列? 就是每一个元素被有序的排成一列 什么是序列化? 就是将原本的列表.字典等内容转化成字符串的过程 什么时候会用到序列化? 数据存储(把数据放在文件.数据库),网络传输等 序列化的目的 1. ...
- Django Rest framework序列化流程
目录 一 什么是序列化 二 Django REST framework配置流程之Serializer 三 Django REST framework配置流程之ModelSerializer 一 什么是 ...
- Django 链接MySQL及数据操作
Django 链接MySQL Django创建的项目自带的数据库是SQLite3,我们想要链接MySQL的话,需要更改settings.py中的配置 1.在MySQL中创建好数据库,Django项目不 ...
随机推荐
- ubuntu openstack windows 镜像制作
openstack windows 镜像制作 首先下载windows所需要的驱动,virtio-win-1.1.16.vfd virtio-win-0.1-59.iso 下载的官方地址是: http ...
- 小记:iOS 中一般对于 view 不依赖 model 的的两种代码书写形式
一. 前言 对于在 MVC 的定义中,view 层是不引用 model 层,view 和 model 是不相往来的 一般开发中,我们都写过 在自定义 view 中增加一个 model 的属性,外接直接 ...
- Android(java)学习笔记102:Dalivk虚拟机的初始化过程
1. 初始化下面系统函数(调用dvmStartup函数初始化所有相关的函数) 开始学习虚拟机的初始化过程,先从dvmStartup函数开始,这个函数实现所有开始虚拟机的准备工作: dvmAllo ...
- 【BZOJ1972】[SDOI2010] 猪国杀(恶心的大模拟)
点此看题面 大致题意: 让你模拟一个游戏猪国杀的过程. 几大坑点 对于这种模拟题,具体思路就不讲了,就说说有哪些坑点. 题面有锅,反猪是\(FP\). 数据有锅,牌堆中的牌可能不够用,牌堆为空之后需一 ...
- BZOJ 4128: Matrix
BZOJ 4128: Matrix 标签(空格分隔): OI BZOJ 大步小步 矩阵 费马小定理 Time Limit: 10 Sec Memory Limit: 128 MB Descriptio ...
- 2018.7.2 如何用js实现点击图片切换为另一图片,再次点击恢复到原图片
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...
- Java基础——动态代理
1.什么是动态代理? 简单的来说,就是本来让我自己做的事,请给别人来做,这个请的人就是代理对象 那么动态代理就是在程序运行过程中产生这个代理对象,而程序运行中产生的对象就是用反射的来生成一个代理. 举 ...
- C#逻辑运算符
一.C#逻辑运算符 C#语言的逻辑运算符是对变量的值.表达式的运算结果进行比较,基比较结果为True或False. 二.示例 using System;using System.Collections ...
- linux网络编程之断点传输文件
以下载链接"http://www.boa.org/boa-0.94.13.tar.gz"为例: 断点续传实验大概步骤: ===================== 1,使用geth ...
- BZOJ3679: 数字之积(数位dp)
题意 题目链接 Sol 推什么结论啊. 直接大力dp,$f[i][j]$表示第$i$位,乘积为$j$,第二维直接开map 能赢! /* */ #include<iostream> #inc ...