1. 程式人生 > >DRF-->1 序列化元件的使用和介面設計---get

DRF-->1 序列化元件的使用和介面設計---get

定義序列化器(本質就是一個類),一般包括模型類的欄位,有自己的欄位型別規則。實現了序列化器後,就可以建立序列化物件以及查詢集進行序列化操作,通過序列化物件.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