【Django】Task4 序列化及其高級(jí)使用、ModelViewSet
Task4主要了解序列化及掌握其高級(jí)使用,了解ModelViewSet的作用,ModelViewSet 是 Django REST framework(DRF)中的一個(gè)視圖集類,用于快速創(chuàng)建處理模型數(shù)據(jù)的 API 視圖。
1.Django的序列化
Django 的序列化是指將復(fù)雜的數(shù)據(jù)結(jié)構(gòu)(通常是數(shù)據(jù)庫(kù)中的模型對(duì)象)轉(zhuǎn)換為可以在不同應(yīng)用程序間傳輸和存儲(chǔ)的格式,如 JSON、XML 或類似的格式。這使得數(shù)據(jù)可以在不同系統(tǒng)、平臺(tái)或前后端之間進(jìn)行交換和共享。
在 Django 中,序列化主要用于處理以下兩個(gè)場(chǎng)景:
數(shù)據(jù)交換和傳輸: 當(dāng)您需要在應(yīng)用程序的不同部分之間傳遞數(shù)據(jù)時(shí),例如在后端和前端之間,或在不同的服務(wù)之間,您可以將數(shù)據(jù)序列化為一種通用格式,如 JSON。這樣,數(shù)據(jù)可以在不同系統(tǒng)之間傳輸和解析。
API 響應(yīng): 在開(kāi)發(fā) Web API 時(shí),您通常會(huì)需要將數(shù)據(jù)庫(kù)中的數(shù)據(jù)轉(zhuǎn)換為特定的數(shù)據(jù)格式(如 JSON),以便客戶端可以輕松地消費(fèi)數(shù)據(jù)。這就涉及到將 Django 模型對(duì)象序列化為 JSON 或其他格式,然后將其返回給客戶端。
Django 提供了一個(gè)內(nèi)置的序列化框架,稱為 Django REST framework(DRF),它是一個(gè)功能強(qiáng)大的工具,用于處理序列化和反序列化。使用 DRF,您可以輕松地將 Django 模型轉(zhuǎn)換為 JSON 格式,或者從 JSON 格式反序列化回模型對(duì)象。
1.1序列化常用到的參數(shù)
在 Django REST framework 中,進(jìn)行序列化時(shí),常用的一些參數(shù)可以用來(lái)控制序列化的行為和輸出。以下是一些常用的序列化參數(shù):
fields
: 用于指定要序列化的字段列表。您可以選擇性地列出要包含在序列化輸出中的字段。
exclude
: 與 fields 相反,用于指定不包含在序列化輸出中的字段列表。
read_only_fields
: 用于指定在反序列化(從 JSON 到模型對(duì)象)時(shí)不允許更新的字段列表。這些字段只能在創(chuàng)建時(shí)指定,之后不能更改。
write_only_fields
: 與 read_only_fields 相反,用于指定在序列化(從模型對(duì)象到 JSON)時(shí)不包含在輸出中的字段列表。這些字段只用于接收輸入。
validators
: 用于指定字段級(jí)別的驗(yàn)證器列表,這些驗(yàn)證器會(huì)在序列化和反序列化過(guò)程中執(zhí)行。
extra_kwargs
: 允許您為特定字段提供附加參數(shù),例如指定自定義驗(yàn)證器或者控制序列化行為。
many
: 用于指示是否進(jìn)行批量序列化。如果為 True,則序列化器將在序列化多個(gè)對(duì)象時(shí)執(zhí)行批量操作。
allow_null
: 用于指示是否允許序列化字段的值為 None,默認(rèn)為 False。
required
: 用于指示字段是否為必填字段,如果為 True,則在反序列化時(shí)必須提供該字段的值。
default
: 用于指定字段的默認(rèn)值,在反序列化時(shí),如果未提供該字段的值,將使用默認(rèn)值。
source
: 用于指定要從模型中獲取數(shù)據(jù)的字段名稱。如果序列化器的字段名稱與模型字段名稱不同,可以使用該參數(shù)來(lái)指定模型字段的名稱。
label
: 用于指定字段在序列化輸出中的標(biāo)簽,用于更友好的展示字段名稱。
這只是一些常見(jiàn)的序列化參數(shù),Django REST framework 提供了豐富的選項(xiàng)和配置,以滿足不同的序列化需求。您可以根據(jù)具體的情況選擇適當(dāng)?shù)膮?shù)來(lái)定制您的序列化器。
1.2序列化示例
以下是一個(gè)簡(jiǎn)單的示例,說(shuō)明如何使用 DRF 進(jìn)行序列化:
- serializer.py
# 定義產(chǎn)品序列化器
from rest_framework.serializers import *
from .models import *
# 產(chǎn)品分類序列化器
class GoodsCategorySerializer(ModelSerializer):
class Meta:
model = GoodsCategory
fields = ('name', 'remark')
# 產(chǎn)品序列化器
class GoodsSerializer(ModelSerializer):
# 外鍵字段相關(guān)的數(shù)據(jù) 需要單獨(dú)序列化
category = GoodsCategorySerializer()
class Meta:
model = Goods
# 序列化單個(gè)字段
fields = ('name',)
# 序列化多個(gè)字段
fields = ('name','number',)
# 序列化所有字段
fields = '__all__'
在這個(gè)示例中,我們定義了名為 GoodsCategorySerializer、GoodsSerializer 的序列化器,用于將 GoodsCategory、Goods 模型轉(zhuǎn)換為 JSON 格式。通過(guò) serializers.ModelSerializer 類,我們可以很方便地將模型字段映射到序列化器的字段,并使用 Meta 類來(lái)指定要序列化的模型和字段。
總之,Django 的序列化是將復(fù)雜的數(shù)據(jù)轉(zhuǎn)換為通用數(shù)據(jù)格式的過(guò)程,用于數(shù)據(jù)交換、API 響應(yīng)等場(chǎng)景。Django REST framework 提供了強(qiáng)大的序列化框架,使數(shù)據(jù)的轉(zhuǎn)換和傳輸變得更加簡(jiǎn)便。
- views.py
from django.shortcuts import render
from rest_framework.response import Response
from .models import *
from rest_framework.decorators import api_view
from django.shortcuts import get_object_or_404
from rest_framework.views import APIView
from .serializer import *
class GetGoods(APIView):
def get(self, request):
data = Goods.objects.all()
serializer = GoodsSerializer(instance=data, many=True)
print(serializer.data)
return Response(serializer.data)
def post(self, request):
# 從請(qǐng)求數(shù)據(jù)中提取字段
request_data = {
"category": request.data.get("Goodscategory"),
"number": request.data.get("number"),
"name": request.data.get("name"),
"barcode": request.data.get("barcode"),
"spec": request.data.get("spec"),
"shelf_life_days": request.data.get("shelf_life_days"),
"purchase_price": request.data.get("purchase_price"),
"retail_price": request.data.get("retail_price"),
"remark": request.data.get("remark"),
}
# 使用 create() 方法創(chuàng)建新的商品對(duì)象
new_goods = Goods.objects.create(**request_data)
# 對(duì)創(chuàng)建的對(duì)象進(jìn)行序列化,并作為響應(yīng)返回
serializer = GoodsSerializer(instance=new_goods)
return Response(serializer.data)
- urls.py
from django.contrib import admin
from django.urls import path
from apps.erp_test.views import *
urlpatterns = [
path('admin/', admin.site.urls),
path('getgoods/', GetGoods.as_view()),
]
1.3序列化單個(gè)對(duì)象
#獲取對(duì)象
data = Goods.objects.get(id=1)?
#創(chuàng)建序列化器
sberializer = GoodsSerializer(instance=data)?
#轉(zhuǎn)換數(shù)據(jù)
print(serializer.data)?
注意點(diǎn):
?instance?是一個(gè)參數(shù),用于指定要序列化或反序列化的 Python 對(duì)象。具體來(lái)說(shuō),它是一個(gè)類實(shí)例(Class Instance),通常是指一個(gè)從數(shù)據(jù)庫(kù)或其他數(shù)據(jù)源中檢索出來(lái)的模型實(shí)例(Model Instance)。
當(dāng)我們需要將一個(gè)模型實(shí)例轉(zhuǎn)換為 JSON 或其他格式時(shí),可以使用 Django 的序列化器(Serializer)來(lái)實(shí)現(xiàn)。
1.4序列化多個(gè)對(duì)象
data = Goods.objects.all() # 獲取對(duì)象
# 創(chuàng)建序列化器,many表示序列化多個(gè)對(duì)象,默認(rèn)為單個(gè)
serializer = GoodsSerializer(instance=data,many=True)
print(serializer.data) # 轉(zhuǎn)換數(shù)據(jù)
# 輸出:
[OrderedDict([('id', 1), ('number', '1'), ('name', '第一個(gè)產(chǎn)品'), ('purchase_price', 100.0), ('retail_price', 150.0), ('remark', '測(cè)試產(chǎn)品')]), OrderedDict([('id', 2), ('number', '123'), ('name', '產(chǎn)品2'), ('purchase_price', 123.0), ('retail_price', 4123.0), ('remark', '測(cè)試產(chǎn)品2')])]
2.Django的ModelViewSet
ModelViewSet 是 Django REST framework(DRF)中的一個(gè)視圖集類,用于快速創(chuàng)建處理模型數(shù)據(jù)的 API 視圖。它提供了一組默認(rèn)的 CRUD(創(chuàng)建、讀取、更新、刪除)操作,可以用于操作 Django 模型中的數(shù)據(jù)。
ModelViewSet 通過(guò)將常見(jiàn)的 API 操作封裝到一個(gè)類中,使得編寫(xiě) API 視圖變得更加簡(jiǎn)潔和方便。它繼承自 DRF 中的 GenericAPIView,并結(jié)合了 ListModelMixin、CreateModelMixin、RetrieveModelMixin、UpdateModelMixin 和 DestroyModelMixin,從而提供了一系列用于處理模型數(shù)據(jù)的默認(rèn)操作。
2.1ModelViewSet示例
以下是一個(gè)使用 ModelViewSet 的簡(jiǎn)單示例:
from rest_framework import viewsets
from .models import Book
from .serializers import BookSerializer
class BookViewSet(viewsets.ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer
在這個(gè)示例中,假設(shè)有一個(gè)名為 Book 的模型和相應(yīng)的序列化器 BookSerializer。通過(guò)創(chuàng)建一個(gè)繼承自 ModelViewSet 的 BookViewSet 類,您可以自動(dòng)獲得以下操作:
知識(shí)點(diǎn) | 請(qǐng)求 | url | 特點(diǎn) |
---|---|---|---|
GenericViewSet | 提供一組通用的視圖方法,方便實(shí)現(xiàn)特定功能 | ||
ListModelMixin | get | 127.0.0.1:8000/book/ | 提供 list ? 方法,用于獲取資源列表
|
RetrieveModelMixin | get | 127.0.0.1:8000/book/{1}/ | 提供 retrieve ? 方法,用于獲取單個(gè)資源的詳細(xì)信息
|
CreateModelMixin | post | 127.0.0.1:8000/book/ | 提供 create ? 方法,用于創(chuàng)建資源
|
UpdateModelMixin | put | 127.0.0.1:8000/book/{1}/ | 提供 update ? 方法,用于更新資源
|
DestroyModelMixin | detete | 127.0.0.1:8000/book/{1}/ | 提供 destroy ? 方法,用于刪除資源
|
自定義 | get/post | 127.0.0.1:8000/book/自定義 | 用戶自定義方法/函數(shù) |
這些技術(shù)知識(shí)點(diǎn)可以配合使用,幫助我們快速構(gòu)建出具有 CRUD 功能的 Web 應(yīng)用,并且遵循了 Django 框架的慣例和最佳實(shí)踐。它們的應(yīng)用場(chǎng)景包括博客系統(tǒng)、電商平臺(tái)、社交網(wǎng)絡(luò)等各種類型的 Web 應(yīng)用。通過(guò)使用這些技術(shù)知識(shí)點(diǎn),我們能夠提高開(kāi)發(fā)效率,減少重復(fù)的代碼編寫(xiě)工作,并且保證代碼的一致性和可維護(hù)性。
列出所有圖書(shū):GET 請(qǐng)求將返回所有圖書(shū)的列表。
創(chuàng)建新圖書(shū):POST 請(qǐng)求將創(chuàng)建一個(gè)新的圖書(shū)。
獲取單個(gè)圖書(shū):GET 請(qǐng)求將返回指定圖書(shū)的詳細(xì)信息。
更新圖書(shū):PUT 或 PATCH 請(qǐng)求將更新指定圖書(shū)的信息。
刪除圖書(shū):DELETE 請(qǐng)求將刪除指定圖書(shū)。
ModelViewSet 還允許您通過(guò)覆蓋一些方法來(lái)自定義行為,例如覆蓋 get_queryset() 來(lái)定義自己的查詢集,或者覆蓋 perform_create() 來(lái)在創(chuàng)建對(duì)象時(shí)執(zhí)行自定義操作。
總之,ModelViewSet 是 Django REST framework 中的一個(gè)有用的工具,用于快速創(chuàng)建處理模型數(shù)據(jù)的 API 視圖,并且提供了一系列默認(rèn)操作,減少了繁瑣的代碼編寫(xiě)。
補(bǔ)充上述圖書(shū)curd中的Book模型和序列化器
定義 Book 模型:
from django.db import models
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.CharField(max_length=100)
publication_date = models.DateField()
isbn = models.CharField(max_length=13)
def __str__(self):
return self.title
與 Book 模型對(duì)應(yīng)的序列化器 BookSerializer:
from rest_framework import serializers
from .models import Book
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = '__all__'
在這個(gè)示例中,我們創(chuàng)建了一個(gè)名為 Book 的模型,其中包含了一些基本的字段,如標(biāo)題、作者、出版日期和 ISBN 號(hào)。然后,我們創(chuàng)建了一個(gè) BookSerializer,使用 serializers.ModelSerializer 類來(lái)定義序列化器。在 Meta 類中,我們將模型設(shè)置為 Book,并使用 fields = ‘all’ 來(lái)指定所有模型字段都會(huì)被包含在序列化輸出中。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-665952.html
通過(guò)這樣的設(shè)置,可以使用 BookSerializer 來(lái)序列化和反序列化 Book 模型的數(shù)據(jù),從而在 API 視圖中進(jìn)行數(shù)據(jù)的展示和操作。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-665952.html
到了這里,關(guān)于【Django】Task4 序列化及其高級(jí)使用、ModelViewSet的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!