• S11 day 93 RestFramework 之 序列化


    1. 表建模

    from django.db import models
    
    # Create your models here.
    
    #文章表
    class Article(models.Model):
        title =models.CharField(max_length=32)
        create_time =models.DateTimeField(auto_now_add=True)#第一次保存时间的日期.
        # update_time =models.DateTimeField(auto_now=True)#每次更新的时间
        type =models.SmallIntegerField(
            choices=((1,"原创"),(2,"转载")),
            default =1
          ) #文章的类型
        #来源
        school =models.ForeignKey(to="School",on_delete=models.CASCADE)#级联删除casecade
        tag =models.ManyToManyField(to="Tag")
    
    #文章来源表
    class School(models.Model):
        name =models.CharField(max_length=16)
    
    # 文章标签表
    class Tag(models.Model):
        name =models.CharField(max_length=16)
    
    #评论
    class Comment(models.Model):
        content=models.CharField(max_length=128)
        article =models.ForeignKey(to='Article',on_delete=models.CASCADE)

    2. Url路由

    from django.conf.urls import url,include
    from django.contrib import admin
    from app01 import views
    
    
    urlpatterns = [
        # url(r"^api/",include(app01_url))
    
    
        url(r'^admin/', admin.site.urls),
        url(r'^article_list/', views.article_list),

     第一版序列化

    from django.shortcuts import render,HttpResponse
    from app01 import models
    # Create your views here.
    
    
    #第一版:
    def article_list(request):
        # 去数据库查询所有的文章数据
        query_set=models.Article.objects.all().values("id","title")
        #序列化成json格式
        import json
        data=json.dumps(list(query_set),ensure_ascii=False)
        #返回.
        return HttpResponse(data)

    输出结果:

     第二版序列化

    # # 第二版
    from django.http import JsonResponse
    def article_list(request):
        # 去数据库查询所有的文章数据
        query_set=models.Article.objects.all().values("id","title","create_time","type")
        print("query_set",query_set)
        # JsonResponse序列化的时候如果不是字典要用safe关键字
        return JsonResponse(list(query_set),safe=False,)

    输出结果:

    query_set <QuerySet [{'id': 1, 'title': 'python文章', 'create_time': datetime.datetime(2018, 7, 31, 17, 10, 35, 690427, tzinfo=<UTC>), 'type': 1}, {'id': 2, 'title': 'go文章', 'create_time': datetime.datetime(2018, 7, 31, 17, 10, 35, 886304, tzinfo=<UTC>), 'type': 1}]>
    [01/Aug/2018 15:45:34] "GET /article_list/ HTTP/1.1" 200 188

     第三版序列化

    # # 第三版
    from django.http import JsonResponse
    from rest_framework import  serializers
    
    class ArticleSerializer(serializers.Serializer):
        id =serializers.IntegerField()
        title =serializers.CharField()
        create_time=serializers.DateTimeField()
        type =serializers.CharField(source="get_type_display")
        school =serializers.CharField(source="school.name") #传了个属性
        tag =serializers.SerializerMethodField()
        #当choice字段和和FK 字段都可以用source获取值
    
        def get_tag(self,obj):
            print("====>",obj.tag.all())
            tag_list =[]
            for i in obj.tag.all():
               tag_list.append(i.name)
            return tag_list
    #
    def article_list(request):
        query_set=models.Article.objects.all()
        xbg =ArticleSerializer(query_set,many=True)
        print("===》",xbg.data)
        return JsonResponse(xbg.data,safe=False,)

    输出结果:

    print到的结果:
    
    [01/Aug/2018 15:49:20] "GET /article_list/ HTTP/1.1" 200 368
    ====> <QuerySet [<Tag: Tag object>, <Tag: Tag object>]>
    ===》 [OrderedDict([('id', 1), ('title', 'python文章'), ('create_time', '2018-07-31T17:10:35.690427Z'), ('type', '原创'), ('school', '沙河校区'), ('tag', ['python tag', 'linux tag'])]), OrderedDict([('id', 2), ('title', 'go文章'), ('create_time', '2018-07-31T17:10:35.886304Z'), ('type', '原创'), ('school', '上海校区'), ('tag', ['python tag', 'linux tag'])])]

     

    第四版序列化 

    # 第四版 modelSeralizer
    class ArticleModelSerilizer(serializers.ModelSerializer):
        type =serializers.CharField(source="get_type_display") #取到 1,或2里的值.
        class Meta:
            model =models.Article
            fields="__all__"
            depth =1
    
    
    def article_list(request):
        query_set=models.Article.objects.all()
        xbg =ArticleModelSerilizer(query_set,many=True)
        print("===》",xbg.data)
        return JsonResponse(xbg.data,safe=False,)

    输出结果:

    [01/Aug/2018 15:53:14] "GET /article_list HTTP/1.1" 301 0
    ===》 [OrderedDict([('id', 1), ('type', '原创'), ('title', 'python文章'), ('create_time', '2018-07-31T17:10:35.690427Z'), ('school', OrderedDict([('id', 1), ('name', '沙河校区')])), ('tag', [OrderedDict([('id', 1), ('name', 'python tag')]), OrderedDict([('id', 2), ('name', 'linux tag')])])]), OrderedDict([('id', 2), ('type', '原创'), ('title', 'go文章'), ('create_time', '2018-07-31T17:10:35.886304Z'), ('school', OrderedDict([('id', 2), ('name', '上海校区')])), ('tag', [OrderedDict([('id', 1), ('name', 'python tag')]), OrderedDict([('id', 2), ('name', 'linux tag')])])])]
    [01/Aug/2018 15:53:14] "GET /article_list/ HTTP/1.1" 200 482

  • 相关阅读:
    交通部道路运输车辆卫星定位系统部标JTT808、809、796标准大全
    linux下如何源码编译安装vim
    Ubuntu如何重新启动tftp服务
    Ubuntu如何自定义tftp服务根目录
    git如何撤销git add操作?
    如何使两台主机间的不同网段互通?
    debian下如何源码安装tmux
    mysql插入数据自动生成主键uuid
    mysql的 UUID的生成方式
    MySQL SQL语句 生成32位 UUID
  • 原文地址:https://www.cnblogs.com/mengbin0546/p/9401688.html
Copyright © 2020-2023  润新知