1. 程式人生 > >Python全棧•rest_framework-序列化(一)

Python全棧•rest_framework-序列化(一)

一、為什麼要序列化

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):功能強大。