DRF-->1 序列化元件的使用和介面設計---get
阿新 • • 發佈:2018-12-06
定義序列化器(本質就是一個類),一般包括模型類的欄位,有自己的欄位型別規則。實現了序列化器後,就可以建立序列化物件以及查詢集進行序列化操作,通過序列化物件.data來獲取資料(不用自己構造字典,再返回Json資料)
廢話不多說,直接上程式碼!!!
DRF序列化可以理解這幾句
- 匯入模組:from rest_framework import serializers - 建立一個序列化類 class BookSerializer(serializers.Serializer): 欄位可以自定義- 獲取客戶端請求資料 - 開始序列化 serialized_data = BookSerializer(origin_data, many=True) - 寫入資料庫 - 獲取序列化後的資料,返回給客戶端 return Response(serialized_data.data)
1.介面設計:
GET 127.0.0.1:8000/books/ #獲取所有資料,返回值: [{}, {}] GET 127.0.0.1:8000/books/{id} # 獲取一條資料,返回值:{} POST 127.0.0.1:8000/books/ # 新增一條資料,返回值:{} PUT 127.0.0.1:8000/books/{id} # 修改資料,返回值:{} DELETE 127.0.0.1:8000/books/{id} # 刪除資料,返回空
2.建立新的專案
models.py #表 class Author(models.Model): nid= models.AutoField(primary_key=True) name = models.CharField(max_length=32) age = models.IntegerField() def __str__(self): return self.name class Publish(models.Model): nid = models.AutoField(primary_key=True) name = models.CharField(max_length=32) city = models.CharField(max_length=32) email = models.EmailField() def __str__(self): return self.name class Book(models.Model): nid = models.AutoField(primary_key=True) title = models.CharField(max_length=32) price = models.DecimalField(max_digits=5, decimal_places=2) # 外來鍵欄位 publish = models.ForeignKey(to="Publish", related_name="book", related_query_name="book_query", on_delete=models.CASCADE) # 多對多欄位 authors = models.ManyToManyField(to="Author")
3進行資料的遷移執行命令
python manage.py makemigrations
python manage.py migrate
4.開始建立檢視和路由
urls.py from django.contrib import admin from django.urls import path from app1 import views urlpatterns = [ path('admin/', admin.site.urls), path('books/',views.BookView.as_view()), ]
views.py
from rest_framwork.views import APIView
from rest_framwork import serializers
from rest_fromwork.response import Response
class BookView(APIView): def get(self,request): book_list = Book.objects.all() # print(book_list) #進行資料的序列化 serializer_book_list = BookSerializer(book_list,many=True) #返回的時候必須帶著data,因為所有的資料都在data裡 return Response(serializer_book_list.data) def post(self,request): pass
5.建立序列化的類
urls.py calss BookSerializer(serializers,Serializer): title = serializers.CharField(max_length=32) price = serializers.DecimalField(max_digits=5,decimal_places=2) publish = serializers.CharField(max_length=32) author= serializers.CharField(max_length=32)
6.注意,現在的頁面是這樣的
7.改進的辦法,也就是說我們序列化的重頭戲‘
url.py class BookSerializer(serializers.Serializer): title = serializers.CharField(max_length=32) price = serializers.DecimalField(max_digits=5,decimal_places=2) publish = serializers.CharField(max_length=32) #這裡必須是用SerializerMethodField()!!! authors_list = serializers.SerializerMethodField() #方法裡有一個get_方法,注意!!!authors_list必須和上邊的序列化一致否則報錯找不到對應的方法! def get_authors_list(self,book_obj): author_list = list() for author in book_obj.authors.all(): author_list.append(author.name) return author_list
’