1. 程式人生 > >DRF-->1 序列化組件的使用和接口設計---get

DRF-->1 序列化組件的使用和接口設計---get

cad ima pen mar all {} manage work object

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

技術分享圖片

DRF-->1 序列化組件的使用和接口設計---get