• Django——restframework(serializers序列化工具)


    创建虚拟环境

    (1)创建一个django的虚拟环境

      

    cd 到一个空的文件夹
    
      pip install virtualenv
    
      pip install --no--site--packages 项目名称
    
      cd 项目目录
    
      Scriptsactivate
    
      pip install django==1.11.11 -i https://pypi.tanu.tsinghua.edu.cn/simple
    
      pip install djangorestframework
    
      完成安装

    (2)打开项目:

    建表:

    from django.db import models
    
    # Create your models here.
    #  文章表
    class Article(models.Model):
        title = models.CharField(max_length=32)
        # 创建文章的时候生成的时间
        create_time = models.DateField(auto_now=True)
        # 更新文章时生成的时间
        update_time = models.DateField(auto_now_add=True)
        type=models.SmallIntegerField(
            choices=((1,'原创'),(2,'转载')),
            default = 1
        )
        school = models.ForeignKey(to = 'School',on_delete = models.CASCADE)
        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)

    数据序列化

    第①种方式:

      直接使用json进行序列化数据。

    from django.shortcuts import render,HttpResponse,redirect,reverse
    from app01 import models
    
    #使用json 对数据库的数据进行序列化
    def article_list(request):
        # 去数据库查询所有的文章数据
        query_set = models.Article.objects.all().values('id','title','create_time','type')
        # 序列成json格式
        # 把时间格式转化成字符串格式
        for i in query_set:
            i['create_time'] = i['create_time'].strftime('%Y-%m-%d')
        import json
        # json 不能够序列化query_set对象,所以我们在这里将query_set装换成list数据类型。
        data = json.dumps(list(query_set),ensure_ascii=False)
        # 返回
        return HttpResponse(data)

    第②种方式:

      from django.http import JsonResponse(利用Django中的JsonResponse来对数据进行序列化)

    from django.shortcuts import render,HttpResponse,redirect,reverse
    from app01 import models
    
     #利用JsonResponse的方式实现数据的序列化
    from django.http import JsonResponse
    def article_list(request):
        # 去数据库查询所有的文章数据
        query_set = models.Article.objects.all().values('id','title','create_time','type')
        # 序列成json格式
        # 把时间格式转化成字符串格式
        # 返回
        # JsonResponse 只能序列化字典/列表,序列化列表需要加safe参数
        return JsonResponse(list(query_set),safe=False)

    第③种使用方式(没有ORM类用这种,像关系型数据库Redis):

        定义一个类 分别序列化某个表中的字# 使用工具serializer工具对数据 进行序列化from django.http import JsonResponse

    from rest_framework import serializers
    
    
    class ArticleSerialize(serializers.Serializer):
        id = serializers.IntegerField()
        title = serializers.CharField()
        create_time = serializers.DateField()
        type = serializers.IntegerField(source=‘get_type_display’)     
      school = serializers.CharField(source='school.name')
     // 在 choice字段和FK(外键)字段中都可以使用source = 'get_字段名_display' 来获取 对应对象的值
      tag =serializers.SerializerMethodField()
      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

      // 在多对多字段中,可以在类下面定义一个‘get_字段名’的方法,来获取多对多中对应对象的值。
    def article_list(request): # 去数据库查询所有的文章数据 query_set = models.Article.objects.all()

      # 因为这里的query_set中有多个数据,所以这里加了一个many = True的参数 article_obj
    = ArticleSerialize(query_set,many=True) return JsonResponse(article_obj.data,safe = False) def article_detail(request,id): article_obj = models.Article.objects.filter(id = id).first()
      
      
      # 因为这里的article_obj中只有一个对象,所以这里并没有加many= True参数 art_detail
    = ArticleSerialize(article_obj) return JsonResponse(art_detail.data)

    第④种方法(有ORM类有这种):

    class Serialitor(serializers.ModelSerializer):
        type = serializers.CharField(source='get_type_display')   // 取到1or2中的值
        class Meta:
          // 定义需要使用的表 model
    = models.Article
          // 定义需要序列化的字段 fields
    = "__all__" or ['id','title']   // 是否需要联表,及联表的个数
         depth
    = 1 # 推荐不超过10层(这里写的时外键关联表的个数) def article_list(request): # 去数据库查询所有的文章数据 query_set = models.Article.objects.all() article_obj = ArticleSerialize(query_set,many=True) return JsonResponse(article_obj.data,safe = False) def article_detail(request,id): article_obj = models.Article.objects.filter(id = id).first() art_detail = ArticleSerialize(article_obj) return JsonResponse(art_detail.data)

    直接定义一个Serialitor类,在下面直接调用就好啦。

      

  • 相关阅读:
    如何心无旁鹜的编程
    [转]虚拟现实和现实增强技术带来的威胁
    Mac上好用软件集锦
    无论如何都要来报到
    Unity3D脚本语言UnityScript初探
    X3DOM新增剪裁平面节点ClipPlane支持
    用Perl编写Apache模块续二
    如何浪费自己青春
    macbook 我们需要买吗
    看了一本Unity3D的教程
  • 原文地址:https://www.cnblogs.com/zsdbk/p/9402413.html
Copyright © 2020-2023  润新知