建立虛擬環境數據庫
(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類,在下面直接調用就好啦。