pydantic學習與使用-2.基本模型(BaseModel)使用


前言

在 pydantic 中定義對象的主要方法是通過模型(模型繼承 BaseModel )。
pydantic主要是一個解析庫,而不是驗證庫。驗證是達到目的的一種手段:建立一個符合所提供的類型和約束的模型。
換句話說,pydantic保證輸出模型的類型和約束,而不是輸入數據。
雖然驗證不是pydantic的主要目的,但您可以使用此庫進行自定義驗證。

基本模型使用

User這是一個模型,它有兩個字段id,一個是整數,是必需的,name一個是字符串,不是必需的(它有一個默認值)

from pydantic import BaseModel

class User(BaseModel):
    id: int
    name = 'yo yo'

類型name是從默認值(字符串)推斷出來的,因此不需要類型注釋(但是請注意當某些字段沒有類型注釋時有關字段順序的警告)

user = User(id='123')

user這是一個實例User。對象的初始化將執行所有解析和驗證,如果沒有ValidationError引發,說明生成的模型實例是有效的。
user實例有 id 和 name 2個屬性

user = User(id='123')
print(user.id)   # 123
print(user.name)  # yo yo

模型的字段可以作為用戶對象的普通屬性訪問。字符串 '123' 已根據字段類型轉換為 int.
name初始化用戶時未設置,因此它具有默認值.

那么如何知道初始化的時候,需要哪些必填字段?可以通過 __fields_set__ 方法

print(user.__fields_set__)  # {'id'}

.dict() 可以將user對象的屬性,轉成字典格式輸出,dict(user) 也是等價的

print(user.dict())  # {'id': 123, 'name': 'yo yo'}
print(dict(user))  # {'id': 123, 'name': 'yo yo'}

.json()可以將user對象的屬性,轉成json格式輸出

print(user.json())  # {"id": 123, "name": "yo yo"}

BaseModel 模型屬性

上面的例子只是展示了模型可以做什么的冰山一角。模型具有以下方法和屬性:
dict() 返回模型字段和值的字典;參看。導出模型
json() 返回一個 JSON 字符串表示dict();參看。導出模型
copy() 返回模型的副本(默認為淺拷貝);參看。導出模型
parse_obj() 如果對象不是字典,則用於將任何對象加載到具有錯誤處理的模型中的實用程序;參看。輔助函數
parse_raw() 用於加載多種格式字符串的實用程序;參看。輔助函數
parse_file() 喜歡parse_raw()但是對於文件路徑;參看。輔助函數
from_orm() 將數據從任意類加載到模型中;參看。ORM模式
schema() 返回將模型表示為 JSON Schema 的字典;參看。圖式
schema_json() schema()返回;的 JSON 字符串表示形式 參看。圖式
construct() 無需運行驗證即可創建模型的類方法;參看。創建沒有驗證的模型
__fields_set__ 初始化模型實例時設置的字段名稱集
__fields__ 模型字段的字典
__config__ 模型的配置類,cf。模型配置

遞歸模型

可以使用模型本身作為注釋中的類型來定義更復雜的分層數據結構。

from typing import List
from pydantic import BaseModel


class Foo(BaseModel):
    count: int
    size: float = None


class Bar(BaseModel):
    apple = 'x'
    banana = 'y'


class Spam(BaseModel):
    foo: Foo
    bars: List[Bar]


m = Spam(foo={'count': 4}, bars=[{'apple': 'x1'}, {'apple': 'x2'}])
print(m)
#> foo=Foo(count=4, size=None) bars=[Bar(apple='x1', banana='y'),
#> Bar(apple='x2', banana='y')]
print(m.dict())
"""
{
    'foo': {'count': 4, 'size': None},
    'bars': [
        {'apple': 'x1', 'banana': 'y'},
        {'apple': 'x2', 'banana': 'y'},
    ],
}
"""

輔助函數

Pydantic為解析數據的模型提供了三個classmethod輔助函數:

  • parse_obj:這與模型的方法非常相似__init__,除了它需要一個字典而不是關鍵字參數。如果傳遞的對象不是 dict,ValidationError則將引發。
  • parse_raw:這需要一個str或bytes並將其解析為json,然后將結果傳遞給parse_obj. 通過適當地設置參數也支持解析泡菜數據。content_type
  • parse_file: 這需要一個文件路徑,讀取文件並將內容傳遞給parse_raw. 如果content_type省略,則從文件的擴展名推斷。

parse_obj 的使用

from datetime import datetime
from pydantic import BaseModel, ValidationError


class User(BaseModel):
    id: int
    name = 'John Doe'
    signup_ts: datetime = None


m = User.parse_obj({'id': 123, 'name': 'James'})
print(m)  # id=123 signup_ts=None name='James'

parse_raw 需要一個str或bytes並將其解析為json

m = User.parse_raw('{"id": 123, "name": "James"}')
print(m)  # > id=123 signup_ts=None name='James'

parse_file 可以讀取一個文件的內容
data.json文件

{
  "id": 123,
  "name": "James"
}

from pathlib import Path

path = Path('data.json')  # 讀取文件內容
m = User.parse_file(path)
print(m)  # > id=123 signup_ts=None name='James'

.write_text()可以自己寫內容到文件

from pathlib import Path
path = Path('data1.json')
path.write_text('{"id": 345, "name": "James 11"}')
m = User.parse_file(path)
print(m)  # > id=345 name='James 11'


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM