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

创建虚拟环境

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

  

cd 到一个空的文件夹

  pip install virtualenv

  pip install --no--site--packages 项目名称

  cd 项目目录

  Scripts\activate

  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类,在下面直接调用就好啦。

  

posted @ 2018-08-01 17:12  Coca-Mirinda  阅读(1042)  评论(0编辑  收藏  举报