自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Sentry 開發(fā)者貢獻指南 - Django Rest Framework(Serializers)

開發(fā) 前端
Serializer 用于獲取復(fù)雜的 python 模型并將它們轉(zhuǎn)換為 json。序列化程序還可用于在驗證傳入數(shù)據(jù)后將 json 反序列化回 Python 模型。

本文轉(zhuǎn)載自微信公眾號「黑客下午茶」,作者為少 。轉(zhuǎn)載本文請聯(lián)系黑客下午茶公眾號。

Serializer 用于獲取復(fù)雜的 python 模型并將它們轉(zhuǎn)換為 json。序列化程序還可用于在驗證傳入數(shù)據(jù)后將 json 反序列化回 Python 模型。

在 Sentry,我們有兩種不同類型的序列化器 :Django Rest Framework Serializer 和 Model Serializer。

Django Rest Framework

Django Rest Framework 序列化程序用于處理進入 Sentry 的數(shù)據(jù)的輸入驗證和轉(zhuǎn)換。

  • https://www.django-rest-framework.org/

示例

在典型的 serializer 中,指定了字段,以便它們根據(jù)您的規(guī)范驗證數(shù)據(jù)的類型和格式。如果寫入適合 model,Django Rest Framework 序列化程序還可以將信息保存到數(shù)據(jù)庫中。

  1. from rest_framework import serializers 
  2. from sentry.api.serializers.rest_framework import ValidationError 
  3.  
  4. class ExampleSerializer(serializers.Serializer): 
  5.     name = serializers.CharField() 
  6.     age = serializers.IntegerField(required=False
  7.     type = serializers.CharField() 
  8.  
  9.     def validate_type(self, attrs, source): 
  10.         type = attrs[source] 
  11.         if type not in ['bear''rabbit''puppy']: 
  12.             raise ValidationError('%s is not a valid type' % type) 
  13.     return attrs 

字段檢查

在上面的示例中, serializer 將接受并驗證包含三個字段的 json:name、age 和 type。其中 name 和 type 必須是strings, age 必須是建議的 integer。默認(rèn)情況下,字段是必需的,如果不提供,serializer 將標(biāo)記為無效。請注意,integer 字段 age,required 設(shè)置為 False。因此可能不包括在內(nèi),serializer 仍將被視為有效。

自定義驗證

對于需要自定義驗證的值(除了簡單的類型檢查),

def validate_(self, attrs, source)

可以創(chuàng)建其中 替換為給定字段的確切變量名稱。因此,例如,如果我有一個字段名稱 typeName,驗證方法名稱將是 validate_typeName, 而如果我有一個名為 type_name 的字段,驗證方法名稱將是 validate_type_name。在上面給出的示例中,類型被檢查并且必須是某個字符串。如果某個字段與您的驗證方法所期望的不匹配,則會引發(fā) ValidationError。

用法

在 endpoint 中,這是 Django Rest Framework Serializer 的典型用法

  1. class ExampleEndpoint(Endpoint): 
  2.     def post(self, request): 
  3.         serializer = ExampleSerializer(request.DATA) 
  4.         if not serializer.is_valid(): 
  5.             return Response(serializer.errors, status=400) 
  6.  
  7.         result = serializer.object 
  8.  
  9.         #Assuming Example is a model with the same fields  
  10.         try: 
  11.             with transaction.atomic(): 
  12.                 Example.objects.create
  13.                     name=result['name'], 
  14.                     age=result.get('age'), 
  15.                     type=result['type'], 
  16.                 ) 
  17.         except IntegrityError: 
  18.             return Response('This example already exists', status=409) 
  19.  
  20.         return Response(serialize(result, request.user), status=201) 

驗證數(shù)據(jù)

來自 Django Rest Framework 的 Serializer 將用于需要驗證的傳入數(shù)據(jù)的方法(即 put 和 post 方法)。一旦序列化器被實例化,你可以調(diào)用 serializer.is_valid() 來驗證數(shù)據(jù)。 serializer.errors 將給出關(guān)于給定數(shù)據(jù)無效的具體反饋。

例如給定的輸入

  1.     'age':5, 
  2.     'type':'puppy' 

serializer 將返回一個錯誤,指出未提供所需的字段名稱。

保存數(shù)據(jù)

確認(rèn)數(shù)據(jù)有效后,您可以通過以下兩種方式之一保存數(shù)據(jù)。上面給出的例子是 sentry 中最常見的。取 serializer.object,它只是經(jīng)過驗證的數(shù)據(jù)(如果 serializer.is_valid() 返回 False,則為 None) 并使用 .objects.create 將該數(shù)據(jù)直接保存在 model 中.

另一種方法使用了更多的 Django Rest Framework 的特性, ModelSerializer

  1. from rest_framework import serializers 
  2. from sentry.api.serializers.rest_framework import ValidationError 
  3.  
  4. class ExampleSerializer(serializer.ModelSerializer): 
  5.     name = serializers.CharField() 
  6.     age = serializers.IntegerField(required=False
  7.     type = serializers.CharField() 
  8.  
  9.     class Meta: 
  10.         model = Example 
  11.   
  12.     def validate_type(self, attrs, source): 
  13.         type = attrs[source] 
  14.         if type not in ['bear''rabbit''puppy']: 
  15.             raise ValidationError('%s is not a valid type' % type) 
  16.         return attrs 
  17.  
  18. class ExampleEndpoint(Endpoint): 
  19.     def post(self, request): 
  20.         serializer = ExampleSerializer(request.DATA) 
  21.         if not serializer.is_valid(): 
  22.             return Response(serializer.errors, status=400) 
  23.  
  24.         example = serializer.save() 
  25.         return Response(serialize(example, request.user), status=201) 

Model Serializer

Sentry's Model Serializers 僅用于傳出數(shù)據(jù)。典型的 model serializer 如下所示:

  • https://github.com/getsentry/sentry/blob/master/src/sentry/api/serializers/base.py
  1. @register(Example) 
  2. class ExampleSerializer(Serializer): 
  3.     def get_attrs(self, item_list, user): 
  4.         attrs = {} 
  5.         types = ExampleTypes.objects.filter( 
  6.             type_name__in=[i.type for i in item_list] 
  7.         ) 
  8.  
  9.         for item in item_list: 
  10.             attrs[item] = {} 
  11.             attrs[item]['type'] = [t for t in types if t.name == item.type_name] 
  12.         return attrs 
  13.  
  14.     def serialize(self, obj, attrs, user): 
  15.         return { 
  16.             'name':obj.name
  17.             'type':attrs['type'], 
  18.             'age': obj.age, 
  19.         } 

注冊 Model Serializer

裝飾器 @register 是必需的,以便

  1. `return Response(serialize(example, request.user), status=201)` 

works. 在這種情況下,它會在后臺搜索匹配的模型 Example, 給定變量 example 的 model 類型。要將 model serializer 與 Model 匹配,您只需執(zhí)行

  1. @register(<ModelName>) 
  2. class ModelSerializer(Serializer): 
  3. ... 

get_attrs 方法

當(dāng) Django Rest Framework 具有類似功能時,為什么要這樣做? get_attrs 方法就是原因。它允許您執(zhí)行批量查詢而不是多個查詢。在我們的示例中,我可以過濾我想要的 item,并使用 python 將它們分配給相關(guān) item, 而不是調(diào)用 ExampleTypes.objects.get(...) 多個 item。在 attr 字典的情況下,key 是 item 本身。并且 value 是一個字典,其中包含要添加的屬性的名稱及其值。

  1. attrs[item] = {'attribute_name': attribute} 

Serialize 方法

 

最后,您返回一個帶有 json 可序列化信息的字典,該信息將與 response 一起返回。

 

責(zé)任編輯:武曉燕 來源: 黑客下午茶
相關(guān)推薦

2022-01-11 20:42:54

開發(fā)Sentry標(biāo)志

2022-01-17 19:34:43

SentryWeb APISentry API

2022-01-15 23:33:47

SentryPyCharm配置

2022-01-18 23:26:45

開發(fā)

2022-01-02 23:26:08

開發(fā)SDK Sentry

2021-12-15 20:06:48

ReactJSSentry開發(fā)者

2022-01-21 21:33:03

開發(fā)JavaScript應(yīng)用

2021-12-25 22:31:55

Sentry 監(jiān)控SDK 開發(fā) 性能監(jiān)控

2022-01-16 22:16:59

數(shù)據(jù)庫Sentry開發(fā)者

2022-01-03 22:59:30

開發(fā)SDK數(shù)據(jù)

2021-12-31 18:35:40

監(jiān)控Sentry開發(fā)

2022-01-02 06:59:43

SentrySDK 開發(fā)客戶端報告

2021-12-16 20:12:37

后端開發(fā)Sentry

2022-01-19 19:49:53

Sentry瀏覽器SDK

2022-01-20 19:49:10

Sentry開發(fā)Scope

2021-12-17 19:15:51

前端蟲洞狀態(tài)

2015-07-22 16:08:46

OpenStack開源貢獻代碼

2018-03-27 23:25:40

Paddle

2019-08-16 10:55:37

開發(fā)者技能AI

2024-05-07 08:45:16

OpenAILlamaIndex大語言模型
點贊
收藏

51CTO技術(shù)棧公眾號