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.序列化

 
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格式数据的方法。




猜你喜欢

转载自www.cnblogs.com/ln-qiqi/p/10553546.html