Python全棧•rest_framework-序列化(一)
阿新 • • 發佈:2018-12-19
一、為什麼要序列化
1、基礎知識背景概要
開發我們的Web API的第一件事是為我們的Web API提供一種將程式碼片段例項序列化和反序列化為諸如json
之類的表示形式的方式。我們可以通過宣告與Django forms非常相似的序列化器(serializers)來實現。
二、實現方法有很多種,我們逐一來實現。
- models部分:
from django.db import models # Create your models here. class Book(models.Model): title = models.CharField(max_length=32) price = models.IntegerField() pub_date = models.DateField() publish = models.ForeignKey("Publish") authors = models.ManyToManyField("Author") def __str__(self): return self.title class Publish(models.Model): name = models.CharField(max_length=32) email = models.EmailField() def __str__(self): return self.name class Author(models.Model): name = models.CharField(max_length=32) age = models.IntegerField() def __str__(self): return self.name
- urls部分:
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^publish/',views.PublishView.as_view()),
]
-
views部分:
方式一(列表中放字典):只能實現序列化
from django.shortcuts import render, HttpResponse from django.views import View from app01.models import * import json #檢視部分 class PublishView(View): def get(self, request): publish_list = list(Publish.objects.all().values("name", "email")) return HttpResponse(json.dumps(publish_list)) def post(self, request): pass
輸出結果:
方式二(和方式一一樣,只不過是手動將字典寫入列表,然後序列化列表temp)
from django.shortcuts import render, HttpResponse from django.views import View from app01.models import * import json class PublishView(View): def get(self, request): publish_list = Publish.objects.all() temp = [] for obj in publish_list: temp.append({ "name": obj.name, "email": obj.email }) return HttpResponse(json.dumps(temp)) def post(self, request): pass
輸出結果:
方式三(把model物件轉換成字典):
from django.shortcuts import render, HttpResponse
from django.views import View
from app01.models import *
import json
from django.forms.models import model_to_dict
class PublishView(View):
def get(self, request):
# 方式三(把model物件轉換成字典):
publish_list = Publish.objects.all()
temp = []
for obj in publish_list:
temp.append(model_to_dict(obj))
return HttpResponse(json.dumps(temp))
def post(self, request):
pass
輸出結果:比 方法一 和 方法二內容豐富一些(多了資料的ID)
方式四(django自帶的serializers):簡單,方便。功能沒有rest_framework強大。
from django.shortcuts import render, HttpResponse
from django.views import View
from app01.models import *
from django.core import serializers
class PublishView(View):
def get(self, request):
publish_list = Publish.objects.all()
ret = serializers.serialize("json", publish_list)
return HttpResponse(ret)
def post(self, request):
pass
輸出結果:很豐富。
方式五(rest_framework):功能強大。