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

建立虚拟环境数据库

(1)建立一个django的虚拟环境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)打开项目:json

建表:app

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)

 

数据序列化工具

第①种方式:spa

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

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)

 

第②种方式:code

  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):blog

    定义一个类 分别序列化某个表中的字# 使用工具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类,在下面直接调用就好啦。

相关文章
相关标签/搜索