日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
如何在PythonWeb框架Django中使用序列化器

序列化用于將數(shù)據(jù)轉(zhuǎn)換為方便存儲(chǔ)或傳輸?shù)母袷?,然后將其重新?gòu)建以供使用。DRF 是最具有知名的序列化器。

創(chuàng)新互聯(lián)公司自2013年起,是專(zhuān)業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元酒泉做網(wǎng)站,已為上家服務(wù),為酒泉各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18980820575

序列化是將數(shù)據(jù)轉(zhuǎn)換為可以存儲(chǔ)或傳輸?shù)母袷?,然后?duì)其進(jìn)行重新構(gòu)建的過(guò)程。在開(kāi)發(fā)應(yīng)用程序或?qū)?shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫(kù)、內(nèi)存或?qū)⑵滢D(zhuǎn)換為文件時(shí),一直會(huì)用到它。

我最近幫助 Labcodes 的兩名初級(jí)開(kāi)發(fā)人員理解序列化器,我想也可以與諸位讀者分享一下我的方法。

假設(shè)你正在編寫(xiě)一個(gè)電子商務(wù)網(wǎng)站,你有一個(gè)訂單,該訂單記錄了某人在某個(gè)日期以某種價(jià)格購(gòu)買(mǎi)了一個(gè)產(chǎn)品:

 
 
 
  1. class Order:
  2.     def __init__(self, product, customer, price, date):
  3.         self.product = product
  4.         self.customer = customer
  5.         self.price = price
  6.         self.date = date

現(xiàn)在,假設(shè)你想從一個(gè)鍵值數(shù)據(jù)庫(kù)中存儲(chǔ)和檢索訂單數(shù)據(jù)。幸運(yùn)的是,它的接口可以接受和返回字典,因此你需要將對(duì)象轉(zhuǎn)換成字典:

 
 
 
  1. def serialize_order(order):
  2.     return {
  3.         'product': order.product,
  4.         'customer': order.customer,
  5.         'price': order.price,
  6.         'date': order.date
  7.     }

如果你想從數(shù)據(jù)庫(kù)中獲取一些數(shù)據(jù),你可以獲取字典數(shù)據(jù)并將其轉(zhuǎn)換為訂單對(duì)象(Order):

 
 
 
  1. def deserialize_order(order_data):
  2.     return Order(
  3.         product=order_data['product'],
  4.         customer=order_data['customer'],
  5.         price=order_data['price'],
  6.         date=order_data['date'],
  7.     )

這對(duì)于簡(jiǎn)單的數(shù)據(jù)非常直接了當(dāng),但是當(dāng)你需要處理一些由復(fù)雜屬性構(gòu)成的復(fù)雜對(duì)象時(shí),這種方法就無(wú)法很好地?cái)U(kuò)展。你還需要處理不同類(lèi)型字段的驗(yàn)證,這需要手工完成大量工作。

此時(shí)框架的序列化可以很方便的派上用場(chǎng)。它們使你可以創(chuàng)建帶有少量模板的序列化器,這將適用于復(fù)雜的情況。

Django 提供了一個(gè)序列化模塊,允許你將模型“轉(zhuǎn)換”為其它格式:

 
 
 
  1. from django.core import serializers
  2.  
  3. serializers.serialize('json', Order.objects.all())

它涵蓋了 Web 應(yīng)用程序最常用的種類(lèi),例如 JSON、YAML 和 XML。但是你也可以使用第三方序列化器或創(chuàng)建自己的序列化器。你只需要在 settings.py 文件中注冊(cè)它:

 
 
 
  1. # settings.py
  2. SERIALIZATION_MODULES = {
  3.     'my_format': appname.serializers.MyFormatSerializer,
  4. }

要?jiǎng)?chuàng)建自己的 MyFormatSerializer,你需要實(shí)現(xiàn) .serialize() 方法并接受一個(gè)查詢(xún)集和其它選項(xiàng)作為參數(shù):

 
 
 
  1. class MyFormatSerializer:
  2.     def serialize(self, queryset, **options):
  3.         # serious serialization happening

現(xiàn)在,你可以將查詢(xún)集序列化為新格式:

 
 
 
  1. from django.core import serializers
  2.  
  3. serializers.serialize('my_format', Order.objects.all())

你可以使用選項(xiàng)參數(shù)來(lái)定義序列化程序的行為。例如,如果要定義在處理 ForeignKeys 時(shí)要使用嵌套序列化,或者只希望數(shù)據(jù)返回其主鍵,你可以傳遞一個(gè) flat=True 參數(shù)作為選項(xiàng),并在方法中處理:

 
 
 
  1. class MyFormatSerializer:
  2.     def serializer(self, queryset, **options):
  3.         if options.get('flat', False):
  4.             # don't recursively serialize relationships
  5.         # recursively serialize relationships

使用 Django 序列化的一種方法是使用 loaddata 和 dumpdata 管理命令。

DRF 序列化器

在 Django 社區(qū)中,Django REST 框架(DRF)提供了最著名的序列化器。盡管你可以使用 Django 的序列化器來(lái)構(gòu)建將在 API 中響應(yīng)的 JSON,但 REST 框架中的序列化器提供了更出色的功能,可以幫助你處理并輕松驗(yàn)證復(fù)雜的數(shù)據(jù)。

在訂單的例子中,你可以像這樣創(chuàng)建一個(gè)序列化器:

 
 
 
  1. from restframework import serializers
  2.  
  3. class OrderSerializer(serializers.Serializer):
  4.     product = serializers.CharField(max_length=255)
  5.     customer = serializers.CharField(max_lenght=255)
  6.     price = serializers.DecimalField(max_digits=5, decimal_places=2)
  7.     date = serializers.DateField()

輕松序列化其數(shù)據(jù):

 
 
 
  1. order = Order('pen', 'renato', 10.50, date.today())
  2. serializer = OrderSerializer(order)
  3.  
  4. serializer.data
  5. # {'product': 'pen', 'customer': 'renato', 'price': '10.50', 'date': '2020-08-16'}

為了能夠從數(shù)據(jù)返回實(shí)例,你需要實(shí)現(xiàn)兩個(gè)方法:create 和 update

 
 
 
  1. from rest_framework import serializers
  2.  
  3. class OrderSerializer(serializers.Serializer):
  4.     product = serializers.CharField(max_length=255)
  5.     customer = serializers.CharField(max_length=255)
  6.     price = serializers.DecimalField(max_digits=5, decimal_places=2)
  7.     date = serializers.DateField()
  8.  
  9.     def create(self, validated_data):
  10.         # 執(zhí)行訂單創(chuàng)建
  11.         return order
  12.  
  13.     def update(self, instance, validated_data):
  14.        # 執(zhí)行實(shí)例更新
  15.        return instance

之后,你可以通過(guò)調(diào)用 is_valid() 來(lái)驗(yàn)證數(shù)據(jù),并通過(guò)調(diào)用 save() 來(lái)創(chuàng)建或更新實(shí)例:

 
 
 
  1. serializer = OrderSerializer(**data)
  2. ## 若要驗(yàn)證數(shù)據(jù),在調(diào)用 save 之前必須執(zhí)行
  3. serializer.is_valid()
  4. serializer.save()

模型序列化器

序列化數(shù)據(jù)時(shí),通常需要從數(shù)據(jù)庫(kù)(即你創(chuàng)建的模型)進(jìn)行數(shù)據(jù)處理。ModelSerializer 與 ModelForm 一樣,提供了一個(gè) API,用于從模型創(chuàng)建序列化器。假設(shè)你有一個(gè)訂單模型:

 
 
 
  1. from django.db import models
  2.  
  3. class Order(models.Model):
  4.     product = models.CharField(max_length=255)
  5.     customer = models.CharField(max_length=255)
  6.     price = models.DecimalField(max_digits=5, decimal_places=2)
  7.     date = models.DateField()    

你可以像這樣為它創(chuàng)建一個(gè)序列化器:

 
 
 
  1. from rest_framework import serializers
  2.  
  3. class OrderSerializer(serializers.ModelSerializer):
  4.     class Meta:
  5.         model = Order
  6.         fields = '__all__'

Django 會(huì)自動(dòng)在序列化器中包含所有模型字段,并創(chuàng)建 create 和 udpate 方法。

在基于類(lèi)的視圖(CBV)中使用序列化器

像 Django CBV 中的 Forms 一樣,序列化器可以很好地與 DRF 集成。你可以設(shè)置 serializer_class 屬性,方便序列化器用于視圖:

 
 
 
  1. from rest_framework import generics
  2.  
  3. class OrderListCreateAPIView(generics.ListCreateAPIView):
  4.     queryset = Order.objects.all()
  5.     serializer_class = OrderSerializer

你也可以定義 get_serializer_class() 方法:

 
 
 
  1. from rest_framework import generics
  2.  
  3. class OrderListCreateAPIView(generics.ListCreateAPIView):
  4.     queryset = Order.objects.all()
  5.    
  6.     def get_serializer_class(self):
  7.         if is_free_order():
  8.             return FreeOrderSerializer
  9.         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 方法。

了解更多

要了解更多資源,參考我朋友 André Ericson 的經(jīng)典 Django REST 框架網(wǎng)站。它是一個(gè)基于類(lèi)的經(jīng)典視圖的 REST 框架版本,可讓你深入查看組成 DRF 的類(lèi)。當(dāng)然,官方文檔也是一個(gè)很棒的資源。


新聞標(biāo)題:如何在PythonWeb框架Django中使用序列化器
URL網(wǎng)址:http://www.5511xx.com/article/coisese.html