django rest-framework 1.序列化 一

上圖爲項目完整的目錄結構前端

1、入門

須要先安裝須要使用到包python

pip install django
pip install djangorestframework

先來建立一個新項目數據庫

django-admin startproject restful
cd restful
# 建立一個應用
python manage.py startapp rest_app  

要想使用rest_framework 須要在django項目下的settings配置文件中的INSTALLED_APPS配置中添加以下配置:
django

INSTALLED_APPS = (
    ...
    'rest_framework',
    'rest_app.apps.Test_appConfig',
)
# 若是您的django版本小於1.9,須要把rest_app.apps.Test_appConfig更換完rest_app

2、建立一個可用的模型

自定義一個遊戲信息表api

class Game(models.Model):
    name = models.CharField(verbose_name='遊戲名',max_length=64)
    company = models.CharField(verbose_name='公司',max_length=64)
    turnover = models.IntegerField(verbose_name='營業額')
    def __str__(self):
        return self.name
# python manage.py makemigrations
# python manage.py migrate # 生成數據庫
# python manage.py createsuperuser  # 建立管理員

在建立數據庫後,利用django admin 後臺添加幾條數據以備後用restful

3、建立一個serializer類

講一下什麼是serializer:app

  serializer 類是用來序列化經過繼承該類,能夠把數據按照自定義的格式進行序列化。能夠重寫父類的方法對數據進行操做。函數

#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = '40kuai'

from rest_framework import serializers
from test_app import models

# 定義一個關於剛纔新建Game表的一個序列化類,用來驗證和序列化Game表數據
class Test_app_serializer(serializers.Serializer):    # 繼承serializers.Serializer類
    name = serializers.CharField(max_length=64)
    company = serializers.CharField(max_length=64)
    turnover = serializers.IntegerField()

    # 定義的create方法來實現新建數據,在子類中不重寫改方法會raise NotImplementedError('`create()` must be implemented.')
    def create(self, validated_data):    
        return models.Game.objects.create(**validated_data)

    def update(self, instance, validated_data): # 同上,不重寫會raise 異常
        instance.game = validated_data.get('name', instance.name)
        instance.company = validated_data.get('company', instance.company)
        instance.turnover = validated_data.get('turnover', instance.turnover)
        return instance    

serializer類 的使用方法和django的From表單的驗證類似。首先是要定義你要進行驗證的字段,須要按照Game表中對數據的格式要求來定義每一個字段,Serializer類也會按照自定義的字段來序列化相應的字段,post

create 和 update方法在用戶進行建立,修改數據時會用到,在父類中這兩個方法是要求重寫的(沒有強制要求)。注:父類中使用的是raise 方法來實現重寫功能。url

4、路由和視圖函數

這裏的路由函數是把全部的路由放到了test_app的urls.py 下,具體配置以下:

# /restful/restful/urls.py 
from django.conf.urls import url,include from django.contrib import admin urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^api/', include('test_app.urls')),# 指向test_app下的urls.py ]
# /restful/test_app/urls.py
from django.conf.urls import url from django.contrib import admin from test_app import views urlpatterns = [ url(r'^game_list/',views.game_list), # 顯示全部相關信息(GET)和建立新數據(POST) url(r'^game_info/(\d+)/', views.game_info),  # 顯示單條數據(GET)以及對數據進行修改(POST) ]

路由就這麼點,沒什麼可講的,下面纔是重點,開始說下視圖函數,視圖函數,視圖函數,視圖函數,視圖函數

from django.shortcuts import render
from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt  # 忽略post請求時的csrf問題
from test_app import serializer
from test_app import models
from rest_framework.renderers import JSONRenderer  # restful提供的序列化類
from rest_framework.parsers import JSONParser  # restful提供的反序列化類


# Create your views here.


@csrf_exempt
def game_list(request):
    if request.method == 'GET':
        game = models.Game.objects.all()  # 獲取數據庫中全部數據
        game_serializer = serializer.Test_app_serializer(instance=game,
                                                         many=True)  # 經過自定義的serializer實例化數據,many參數爲True表示處理多條數據
        return HttpResponse(JSONRenderer().render(game_serializer.data))  # 序列化serializer實例的數據
    elif request.method == 'POST':
        data = JSONParser().parse(request)  # 經過JsonParser類反序列化POST過來的數據
        game_serializer = serializer.Test_app_serializer(data=data)  # 經過反序列化後的數據建立serializer實例
        print(game_serializer)
        if game_serializer.is_valid():  # 經過is_valid()方法判斷數據類型是否正確,這點和Django的From類似
            game_serializer.save()  # 驗證經過保存數據,這裏的game_serializer是自定義serializer的create函數返回的對象,進行保存
            return HttpResponse(JSONRenderer().render(game_serializer.data)) # 序列化數據返回前端
        else:  # 驗證不經過,輸出對應的報錯信息
            print("驗證不經過")
            return HttpResponse(JSONRenderer().render(game_serializer.errors)) 


# 註釋同上
@csrf_exempt
def game_info(request, game_id):
    game_obj = models.Game.objects.get(id=game_id)
    if request.method == 'GET':
        game_serializer = serializer.Test_app_serializer(instance=game_obj)
        data = JSONRenderer().render(game_serializer.data)
        return HttpResponse(data)
    elif request.method == 'POST':
        data = JSONParser().parse(request)
        game_serializer = serializer.Test_app_serializer(instance=game_obj, data=data)
        if game_serializer.is_valid():
            game_serializer.save()
            return HttpResponse(JSONRenderer().render(game_serializer.data))
        else:
            return HttpResponse(JSONRenderer().render(game_serializer.errors))
相關文章
相關標籤/搜索