新聞中心
序列化用于將數(shù)據(jù)轉(zhuǎn)換為方便存儲或傳輸?shù)母袷剑缓髮⑵渲匦聵?gòu)建以供使用。DRF 是最具有知名的序列化器。
創(chuàng)新互聯(lián)公司自2013年起,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務公司,擁有項目成都網(wǎng)站設(shè)計、成都做網(wǎng)站網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元酒泉做網(wǎng)站,已為上家服務,為酒泉各地企業(yè)和個人服務,聯(lián)系電話:18980820575
序列化是將數(shù)據(jù)轉(zhuǎn)換為可以存儲或傳輸?shù)母袷剑缓髮ζ溥M行重新構(gòu)建的過程。在開發(fā)應用程序或?qū)?shù)據(jù)存儲在數(shù)據(jù)庫、內(nèi)存或?qū)⑵滢D(zhuǎn)換為文件時,一直會用到它。
我最近幫助 Labcodes 的兩名初級開發(fā)人員理解序列化器,我想也可以與諸位讀者分享一下我的方法。
假設(shè)你正在編寫一個電子商務網(wǎng)站,你有一個訂單,該訂單記錄了某人在某個日期以某種價格購買了一個產(chǎn)品:
class Order:def __init__(self, product, customer, price, date):self.product = productself.customer = customerself.price = priceself.date = date
現(xiàn)在,假設(shè)你想從一個鍵值數(shù)據(jù)庫中存儲和檢索訂單數(shù)據(jù)。幸運的是,它的接口可以接受和返回字典,因此你需要將對象轉(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)換為訂單對象(Order):
def deserialize_order(order_data):return Order(product=order_data['product'],customer=order_data['customer'],price=order_data['price'],date=order_data['date'],)
這對于簡單的數(shù)據(jù)非常直接了當,但是當你需要處理一些由復雜屬性構(gòu)成的復雜對象時,這種方法就無法很好地擴展。你還需要處理不同類型字段的驗證,這需要手工完成大量工作。
此時框架的序列化可以很方便的派上用場。它們使你可以創(chuàng)建帶有少量模板的序列化器,這將適用于復雜的情況。
Django 提供了一個序列化模塊,允許你將模型“轉(zhuǎn)換”為其它格式:
from django.core import serializersserializers.serialize('json', Order.objects.all())
它涵蓋了 Web 應用程序最常用的種類,例如 JSON、YAML 和 XML。但是你也可以使用第三方序列化器或創(chuàng)建自己的序列化器。你只需要在 settings.py 文件中注冊它:
# settings.pySERIALIZATION_MODULES = {'my_format': appname.serializers.MyFormatSerializer,}
要創(chuàng)建自己的 MyFormatSerializer,你需要實現(xiàn) .serialize() 方法并接受一個查詢集和其它選項作為參數(shù):
class MyFormatSerializer:def serialize(self, queryset, **options):# serious serialization happening
現(xiàn)在,你可以將查詢集序列化為新格式:
from django.core import serializersserializers.serialize('my_format', Order.objects.all())
你可以使用選項參數(shù)來定義序列化程序的行為。例如,如果要定義在處理 ForeignKeys 時要使用嵌套序列化,或者只希望數(shù)據(jù)返回其主鍵,你可以傳遞一個 flat=True 參數(shù)作為選項,并在方法中處理:
class MyFormatSerializer:def serializer(self, queryset, **options):if options.get('flat', False):# don't recursively serialize relationships# recursively serialize relationships
使用 Django 序列化的一種方法是使用 loaddata 和 dumpdata 管理命令。
DRF 序列化器
在 Django 社區(qū)中,Django REST 框架(DRF)提供了最著名的序列化器。盡管你可以使用 Django 的序列化器來構(gòu)建將在 API 中響應的 JSON,但 REST 框架中的序列化器提供了更出色的功能,可以幫助你處理并輕松驗證復雜的數(shù)據(jù)。
在訂單的例子中,你可以像這樣創(chuàng)建一個序列化器:
from restframework import serializersclass 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ù)返回實例,你需要實現(xiàn)兩個方法:create 和 update:
from rest_framework import serializersclass 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 orderdef update(self, instance, validated_data):# 執(zhí)行實例更新return instance
之后,你可以通過調(diào)用 is_valid() 來驗證數(shù)據(jù),并通過調(diào)用 save() 來創(chuàng)建或更新實例:
serializer = OrderSerializer(**data)## 若要驗證數(shù)據(jù),在調(diào)用 save 之前必須執(zhí)行serializer.is_valid()serializer.save()
模型序列化器
序列化數(shù)據(jù)時,通常需要從數(shù)據(jù)庫(即你創(chuàng)建的模型)進行數(shù)據(jù)處理。ModelSerializer 與 ModelForm 一樣,提供了一個 API,用于從模型創(chuàng)建序列化器。假設(shè)你有一個訂單模型:
from django.db import modelsclass 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)建一個序列化器:
from rest_framework import serializersclass OrderSerializer(serializers.ModelSerializer):class Meta:model = Orderfields = '__all__'
Django 會自動在序列化器中包含所有模型字段,并創(chuàng)建 create 和 udpate 方法。
在基于類的視圖(CBV)中使用序列化器
像 Django CBV 中的 Forms 一樣,序列化器可以很好地與 DRF 集成。你可以設(shè)置 serializer_class 屬性,方便序列化器用于視圖:
from rest_framework import genericsclass OrderListCreateAPIView(generics.ListCreateAPIView):queryset = Order.objects.all()serializer_class = OrderSerializer
你也可以定義 get_serializer_class() 方法:
from rest_framework import genericsclass OrderListCreateAPIView(generics.ListCreateAPIView):queryset = Order.objects.all()def get_serializer_class(self):if is_free_order():return FreeOrderSerializerreturn OrderSerializer
在 CBV 中還有其它與序列化器交互的方法。例如,get_serializer() 返回一個已經(jīng)實例化的序列化器,get_serializer_context() 返回創(chuàng)建實例時傳遞給序列化器的參數(shù)。對于創(chuàng)建或更新數(shù)據(jù)的視圖,有 create 和 update,它們使用 is_valid 方法驗證數(shù)據(jù),還有 perform_create 和 perform_update 調(diào)用序列化器的 save 方法。
了解更多
要了解更多資源,參考我朋友 André Ericson 的經(jīng)典 Django REST 框架網(wǎng)站。它是一個基于類的經(jīng)典視圖的 REST 框架版本,可讓你深入查看組成 DRF 的類。當然,官方文檔也是一個很棒的資源。
當前題目:如何在PythonWeb框架Django中使用序列化器
標題路徑:http://www.dlmjj.cn/article/coisese.html


咨詢
建站咨詢

