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