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




posted @ 2019-03-18 17:28  阿Q啊  阅读(714)  评论(0编辑  收藏  举报