您好,登錄后才能下訂單哦!
這篇文章主要講解了“怎么在Python Web框架Django中使用序列化器”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“怎么在Python Web框架Django中使用序列化器”吧!
序列化用于將數(shù)據(jù)轉(zhuǎn)換為方便存儲(chǔ)或傳輸?shù)母袷?,然后將其重新?gòu)建以供使用。DRF 是最具有知名的序列化器。
序列化是將數(shù)據(jù)轉(zhuǎn)換為可以存儲(chǔ)或傳輸?shù)母袷?,然后?duì)其進(jìn)行重新構(gòu)建的過程。在開發(fā)應(yīng)用程序或?qū)?shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫、內(nèi)存或?qū)⑵滢D(zhuǎn)換為文件時(shí),一直會(huì)用到它。
我最近幫助 Labcodes 的兩名初級(jí)開發(fā)人員理解序列化器,我想也可以與諸位讀者分享一下我的方法。
假設(shè)你正在編寫一個(gè)電子商務(wù)網(wǎng)站,你有一個(gè)訂單,該訂單記錄了某人在某個(gè)日期以某種價(jià)格購買了一個(gè)產(chǎn)品:
class Order: def __init__(self, product, customer, price, date): self.product = product self.customer = customer self.price = price self.date = date
現(xiàn)在,假設(shè)你想從一個(gè)鍵值數(shù)據(jù)庫中存儲(chǔ)和檢索訂單數(shù)據(jù)。幸運(yùn)的是,它的接口可以接受和返回字典,因此你需要將對(duì)象轉(zhuǎn)換成字典:
def serialize_order(order): return { 'product': order.product, 'customer': order.customer, 'price': order.price, 'date': order.date }
如果你想從數(shù)據(jù)庫中獲取一些數(shù)據(jù),你可以獲取字典數(shù)據(jù)并將其轉(zhuǎn)換為訂單對(duì)象(Order
):
def deserialize_order(order_data): return Order( product=order_data['product'], customer=order_data['customer'], price=order_data['price'], date=order_data['date'], )
這對(duì)于簡單的數(shù)據(jù)非常直接了當(dāng),但是當(dāng)你需要處理一些由復(fù)雜屬性構(gòu)成的復(fù)雜對(duì)象時(shí),這種方法就無法很好地?cái)U(kuò)展。你還需要處理不同類型字段的驗(yàn)證,這需要手工完成大量工作。
此時(shí)框架的序列化可以很方便的派上用場。它們使你可以創(chuàng)建帶有少量模板的序列化器,這將適用于復(fù)雜的情況。
Django 提供了一個(gè)序列化模塊,允許你將模型“轉(zhuǎn)換”為其它格式:
from django.core import serializers serializers.serialize('json', Order.objects.all())
它涵蓋了 Web 應(yīng)用程序最常用的種類,例如 JSON、YAML 和 XML。但是你也可以使用第三方序列化器或創(chuàng)建自己的序列化器。你只需要在 settings.py
文件中注冊(cè)它:
# settings.pySERIALIZATION_MODULES = { 'my_format': appname.serializers.MyFormatSerializer,}
要?jiǎng)?chuàng)建自己的 MyFormatSerializer
,你需要實(shí)現(xiàn) .serialize()
方法并接受一個(gè)查詢集和其它選項(xiàng)作為參數(shù):
class MyFormatSerializer: def serialize(self, queryset, **options): # serious serialization happening
現(xiàn)在,你可以將查詢集序列化為新格式:
from django.core import serializers serializers.serialize('my_format', Order.objects.all())
你可以使用選項(xiàng)參數(shù)來定義序列化程序的行為。例如,如果要定義在處理 ForeignKeys
時(shí)要使用嵌套序列化,或者只希望數(shù)據(jù)返回其主鍵,你可以傳遞一個(gè) flat=True
參數(shù)作為選項(xiàng),并在方法中處理:
class MyFormatSerializer: def serializer(self, queryset, **options): if options.get('flat', False): # don't recursively serialize relationships # recursively serialize relationships
使用 Django 序列化的一種方法是使用 loaddata
和 dumpdata
管理命令。
在 Django 社區(qū)中,Django REST 框架(DRF)提供了最著名的序列化器。盡管你可以使用 Django 的序列化器來構(gòu)建將在 API 中響應(yīng)的 JSON,但 REST 框架中的序列化器提供了更出色的功能,可以幫助你處理并輕松驗(yàn)證復(fù)雜的數(shù)據(jù)。
在訂單的例子中,你可以像這樣創(chuàng)建一個(gè)序列化器:
from restframework import serializers class OrderSerializer(serializers.Serializer): product = serializers.CharField(max_length=255) customer = serializers.CharField(max_lenght=255) price = serializers.DecimalField(max_digits=5, decimal_places=2) date = serializers.DateField()
輕松序列化其數(shù)據(jù):
order = Order('pen', 'renato', 10.50, date.today())serializer = OrderSerializer(order) serializer.data# {'product': 'pen', 'customer': 'renato', 'price': '10.50', 'date': '2020-08-16'}
為了能夠從數(shù)據(jù)返回實(shí)例,你需要實(shí)現(xiàn)兩個(gè)方法:create
和 update
:
from rest_framework import serializers class OrderSerializer(serializers.Serializer): product = serializers.CharField(max_length=255) customer = serializers.CharField(max_length=255) price = serializers.DecimalField(max_digits=5, decimal_places=2) date = serializers.DateField() def create(self, validated_data): # 執(zhí)行訂單創(chuàng)建 return order def update(self, instance, validated_data): # 執(zhí)行實(shí)例更新 return instance
之后,你可以通過調(diào)用 is_valid()
來驗(yàn)證數(shù)據(jù),并通過調(diào)用 save()
來創(chuàng)建或更新實(shí)例:
serializer = OrderSerializer(**data)## 若要驗(yàn)證數(shù)據(jù),在調(diào)用 save 之前必須執(zhí)行serializer.is_valid()serializer.save()
序列化數(shù)據(jù)時(shí),通常需要從數(shù)據(jù)庫(即你創(chuàng)建的模型)進(jìn)行數(shù)據(jù)處理。ModelSerializer
與 ModelForm
一樣,提供了一個(gè) API,用于從模型創(chuàng)建序列化器。假設(shè)你有一個(gè)訂單模型:
from django.db import models class Order(models.Model): product = models.CharField(max_length=255) customer = models.CharField(max_length=255) price = models.DecimalField(max_digits=5, decimal_places=2) date = models.DateField()
你可以像這樣為它創(chuàng)建一個(gè)序列化器:
from rest_framework import serializers class OrderSerializer(serializers.ModelSerializer): class Meta: model = Order fields = '__all__'
Django 會(huì)自動(dòng)在序列化器中包含所有模型字段,并創(chuàng)建 create
和 udpate
方法。
像 Django CBV 中的 Forms
一樣,序列化器可以很好地與 DRF 集成。你可以設(shè)置 serializer_class
屬性,方便序列化器用于視圖:
from rest_framework import generics class OrderListCreateAPIView(generics.ListCreateAPIView): queryset = Order.objects.all() serializer_class = OrderSerializer
你也可以定義 get_serializer_class()
方法:
from rest_framework import generics class OrderListCreateAPIView(generics.ListCreateAPIView): queryset = Order.objects.all() def get_serializer_class(self): if is_free_order(): return FreeOrderSerializer return OrderSerializer
在 CBV 中還有其它與序列化器交互的方法。例如,get_serializer() 返回一個(gè)已經(jīng)實(shí)例化的序列化器,get_serializer_context() 返回創(chuàng)建實(shí)例時(shí)傳遞給序列化器的參數(shù)。對(duì)于創(chuàng)建或更新數(shù)據(jù)的視圖,有 create
和 update
,它們使用 is_valid
方法驗(yàn)證數(shù)據(jù),還有 perform_create 和 perform_update 調(diào)用序列化器的 save
方法。
感謝各位的閱讀,以上就是“怎么在Python Web框架Django中使用序列化器”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)怎么在Python Web框架Django中使用序列化器這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。