成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何在 Python Web 框架 Django 中使用序列化器

開發 后端
序列化用于將數據轉換為方便存儲或傳輸的格式,然后將其重新構建以供使用。DRF 是最具有知名的序列化器。

[[356442]]

序列化用于將數據轉換為方便存儲或傳輸的格式,然后將其重新構建以供使用。DRF 是最具有知名的序列化器。

序列化是將數據轉換為可以存儲或傳輸的格式,然后對其進行重新構建的過程。在開發應用程序或將數據存儲在數據庫、內存或將其轉換為文件時,一直會用到它。

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

假設你正在編寫一個電子商務網站,你有一個訂單,該訂單記錄了某人在某個日期以某種價格購買了一個產品:

  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

現在,假設你想從一個鍵值數據庫中存儲和檢索訂單數據。幸運的是,它的接口可以接受和返回字典,因此你需要將對象轉換成字典:

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

如果你想從數據庫中獲取一些數據,你可以獲取字典數據并將其轉換為訂單對象(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.     )

這對于簡單的數據非常直接了當,但是當你需要處理一些由復雜屬性構成的復雜對象時,這種方法就無法很好地擴展。你還需要處理不同類型字段的驗證,這需要手工完成大量工作。

此時框架的序列化可以很方便的派上用場。它們使你可以創建帶有少量模板的序列化器,這將適用于復雜的情況。

Django 提供了一個序列化模塊,允許你將模型“轉換”為其它格式:

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

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

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

要創建自己的 MyFormatSerializer,你需要實現 .serialize() 方法并接受一個查詢集和其它選項作為參數:

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

現在,你可以將查詢集序列化為新格式:

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

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

  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 社區中,Django REST 框架(DRF)提供了最著名的序列化器。盡管你可以使用 Django 的序列化器來構建將在 API 中響應的 JSON,但 REST 框架中的序列化器提供了更出色的功能,可以幫助你處理并輕松驗證復雜的數據。

在訂單的例子中,你可以像這樣創建一個序列化器:

  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()

輕松序列化其數據:

  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'}

為了能夠從數據返回實例,你需要實現兩個方法: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.         # 執行訂單創建
  11.         return order
  12.  
  13.     def update(self, instance, validated_data):
  14.        # 執行實例更新
  15.        return instance

之后,你可以通過調用 is_valid() 來驗證數據,并通過調用 save() 來創建或更新實例:

  1. serializer = OrderSerializer(**data)
  2. ## 若要驗證數據,在調用 save 之前必須執行
  3. serializer.is_valid()
  4. serializer.save()

模型序列化器

序列化數據時,通常需要從數據庫(即你創建的模型)進行數據處理。ModelSerializer 與 ModelForm 一樣,提供了一個 API,用于從模型創建序列化器。假設你有一個訂單模型:

  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()    

你可以像這樣為它創建一個序列化器:

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

Django 會自動在序列化器中包含所有模型字段,并創建 create 和 udpate 方法。

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

像 Django CBV 中的 Forms 一樣,序列化器可以很好地與 DRF 集成。你可以設置 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() 返回一個已經實例化的序列化器,get_serializer_context() 返回創建實例時傳遞給序列化器的參數。對于創建或更新數據的視圖,有 create 和 update,它們使用 is_valid 方法驗證數據,還有 perform_create 和 perform_update 調用序列化器的 save 方法。

了解更多

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

責任編輯:龐桂玉 來源: Linux中國
相關推薦

2021-06-09 09:36:18

DjangoElasticSearLinux

2022-06-23 08:00:53

PythonDateTime模塊

2023-12-13 13:49:52

Python序列化模塊

2022-08-06 08:41:18

序列化反序列化Hessian

2024-11-04 15:30:43

Python裝飾器函數

2020-09-09 07:00:00

TensorFlow神經網絡人工智能

2025-03-21 09:58:59

Python數據類型安全

2022-05-10 09:12:16

TypeScript裝飾器

2011-06-01 15:05:02

序列化反序列化

2022-03-09 07:10:50

Quarkus框架項目

2009-08-24 17:14:08

C#序列化

2010-01-08 13:25:07

ibmdwXML

2009-03-10 13:38:01

Java序列化字節流

2025-05-08 08:30:00

Redis自定義序列化數據庫

2025-01-20 08:40:00

Python對象

2025-03-05 10:49:32

2011-06-01 15:18:43

Serializabl

2009-08-06 11:16:25

C#序列化和反序列化

2011-05-18 15:20:13

XML

2018-03-19 10:20:23

Java序列化反序列化
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 免费不卡av| 成人在线电影网站 | 午夜精品在线观看 | 国产精品视频网 | 欧美专区在线 | 综合色播 | 国产精品久久久久久久久久免费看 | 在线一区视频 | 性色av香蕉一区二区 | 99re视频在线 | 中国大陆高清aⅴ毛片 | 国产电影一区二区 | 在线观看的av | 国产精品一区二区在线 | 色精品 | 99精品久久久 | 国产一区二区三区在线免费观看 | 噜噜噜噜狠狠狠7777视频 | www日本高清视频 | 91porn成人精品| 麻豆av电影网 | 中文字幕 亚洲一区 | 久久精品国产一区 | 中文字幕在线视频免费观看 | 国产黄色网址在线观看 | 午夜影院网站 | 理论片免费在线观看 | 日韩精品一区二区三区视频播放 | 国产精品中文字幕一区二区三区 | 天堂视频免费 | 国产精品18hdxxxⅹ在线 | 国产精品99久久久久久久久 | 天堂av免费观看 | 欧美一区二区三区国产 | 性视频网 | 欧美日韩在线视频一区 | 一区二区三区日韩 | 日日操av| 国产日产精品一区二区三区四区 | 精品成人| 黑人精品欧美一区二区蜜桃 |