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




  • 相关阅读:
    【报错问题】mysql无法使用别名查询
    【报错问题】java.lang.IllegalStateException: It is illegal to call this method if the current request is not in asynchronous mode
    【源码】-springboot 启动后立马执行的方式
    【LINUX】$搭配使用的含义
    【JAVA】javaMail附件名超过60显示错误
    【Gradle】简单入门
    慢SQL案例之一
    【Flink】一. 什么是Flink?
    【spring基础】环境的搭建与后台
    [org.apache.common][打算学习开源工具包]
  • 原文地址:https://www.cnblogs.com/ln-qiqi/p/10553546.html
Copyright © 2020-2023  润新知