定義project 的urls
from django.contrib import adminfrom django.urls import pathfrom django.conf.urls import url,includeurlpatterns = [path('admin/', admin.site.urls),url (r'^api/',include('app1.urls')),]
定義app 的url
from django.contrib import adminfrom django.urls import pathfrom django.conf.urls import urlfrom app1.views import person_list,person_detailurlpatterns = [path('admin/', admin.site.urls),url (r'^person/$',person_list),url (r'^person/(?P<pk>[0-9]+)$',person_detail),]
定義Person models
from django.db import modelsclass Person(models.Model):
name = models.CharField(max_length = 64)
age = models.IntegerField()
tel = models.CharField(max_length=64)
def __str__(self):
return "{} {} {}" % (self.name, self.age,self.tel)
撰寫Serializer 類別
當有人呼叫save 方法時,PersonSerializer 繼承自serializer.Serializer 然後override create 與update 方法。事實上,我們也必須實作這兩個方法,因為在serializer.Serializer 類別中宣告了NonImplementError 例外。
create 方法收到validated_data 資料後,傳回一個新的instance, update 方法找到一個已存在的instance,並透過validated_data 的參數進行更新
class PersonSerializer(serializers.Serializer):
pk = serializers.IntegerField(read_only=True)
name = serializers.CharField(max_length = 64)
age = serializers.IntegerField( )
tel = serializers.CharField(max_length = 64)
def create (self,validated_data):
return Person.objects.create(**validated_data)
def update (self,instance,validated_data):
instance.name = validated_data.get('name',instance.name)
instance.age = validated_data.get('age',instance.age)
instance.tel = validated_data.get('tel',instance.tel)
instance.save()
return instance
下面的例子為將 serializer.data 的JSON 字串轉到網頁
from django.shortcuts import render
from rest_framework.renderers import JSONRenderer
from django.views.decorators.csrf import csrf_exempt
from rest_framework import status
from app1.models import Person
from app1.serializers import PersonSerializer
from django.http import HttpResponse
from rest_framework.parsers import JSONParser# Create your views here.class JSONResponse(HttpResponse):
def __init__(self,data,**kwargs):
content = JSONRenderer().render(data)
kwargs['content_type'] = 'application/json'
super(JSONResponse,self).__init__(content,**kwargs)
@csrf_exempt
def person_list(request):
if request.method == 'GET':
person = Person.objects.all()
person_serializer = PersonSerializer(person,many = True)
return JSONResponse(person_serializer.data)
elif request.method == 'POST':
person_data = JSONParser().parse(request)
person_serializer = PersonSerializer(data = person_data)
if person_serializer.is_valid():
person_serializer.save()
return JSONResponse(person_serializer.data,status = status.HTTP_201_CREATED)
return JSONResponse(person_serializer.error,status = status.HTTP_404_NOT_FOUND)@csrf_exempt
def person_detail(request,pk):
try:
person = Person.objects.get(pk = pk)
except:
return HttpResponse(status = status.HTTP_404_NOT_FOUND)if request.method == 'GET':
person_serializer = PersonSerializer(person)
return JSONResponse(person_serializer.data)if request.method == 'PUT':
person_data = JSONParser().parse(request)
person_serializer = PersonSerializer(person,data = person_data)
if person_serializer.is_valid():
person_serializer.save()
return JSONResponse(person_serializer.data)
return JSONResponse(person_serializer.error,status = status.HTTP_404_NOT_FOUND)