Dataclass Kullanımı¶
🌐 Translation by AI and humans
This translation was made by AI guided by humans. 🤝
It could have mistakes of misunderstanding the original meaning, or looking unnatural, etc. 🤖
You can improve this translation by helping us guide the AI LLM better.
FastAPI, Pydantic üzerine inşa edilmiştir ve request/response tanımlamak için Pydantic model'lerini nasıl kullanacağınızı gösteriyordum.
Ancak FastAPI, dataclasses kullanmayı da aynı şekilde destekler:
from dataclasses import dataclass
from fastapi import FastAPI
@dataclass
class Item:
name: str
price: float
description: str | None = None
tax: float | None = None
app = FastAPI()
@app.post("/items/")
async def create_item(item: Item):
return item
🤓 Other versions and variants
from dataclasses import dataclass
from typing import Union
from fastapi import FastAPI
@dataclass
class Item:
name: str
price: float
description: Union[str, None] = None
tax: Union[float, None] = None
app = FastAPI()
@app.post("/items/")
async def create_item(item: Item):
return item
Bu destek hâlâ Pydantic sayesinde vardır; çünkü Pydantic, dataclasses için dahili destek sunar.
Yani yukarıdaki kod Pydantic'i doğrudan kullanmasa bile, FastAPI bu standart dataclass'ları Pydantic'in kendi dataclass biçimine dönüştürmek için Pydantic'i kullanmaktadır.
Ve elbette aynı özellikleri destekler:
- veri doğrulama (data validation)
- veri serileştirme (data serialization)
- veri dokümantasyonu (data documentation), vb.
Bu, Pydantic model'lerinde olduğu gibi çalışır. Aslında arka planda da aynı şekilde, Pydantic kullanılarak yapılır.
Bilgi
Dataclass'ların, Pydantic model'lerinin yapabildiği her şeyi yapamadığını unutmayın.
Bu yüzden yine de Pydantic model'lerini kullanmanız gerekebilir.
Ancak elinizde zaten bir sürü dataclass varsa, bunları FastAPI ile bir web API'yi beslemek için kullanmak güzel bir numaradır. 🤓
response_model İçinde Dataclass'lar¶
response_model parametresinde dataclasses da kullanabilirsiniz:
from dataclasses import dataclass, field
from fastapi import FastAPI
@dataclass
class Item:
name: str
price: float
tags: list[str] = field(default_factory=list)
description: str | None = None
tax: float | None = None
app = FastAPI()
@app.get("/items/next", response_model=Item)
async def read_next_item():
return {
"name": "Island In The Moon",
"price": 12.99,
"description": "A place to be playin' and havin' fun",
"tags": ["breater"],
}
🤓 Other versions and variants
from dataclasses import dataclass, field
from typing import Union
from fastapi import FastAPI
@dataclass
class Item:
name: str
price: float
tags: list[str] = field(default_factory=list)
description: Union[str, None] = None
tax: Union[float, None] = None
app = FastAPI()
@app.get("/items/next", response_model=Item)
async def read_next_item():
return {
"name": "Island In The Moon",
"price": 12.99,
"description": "A place to be playin' and havin' fun",
"tags": ["breater"],
}
Dataclass otomatik olarak bir Pydantic dataclass'ına dönüştürülür.
Bu sayede şeması API docs kullanıcı arayüzünde görünür:

İç İçe Veri Yapılarında Dataclass'lar¶
İç içe veri yapıları oluşturmak için dataclasses ile diğer type annotation'ları da birleştirebilirsiniz.
Bazı durumlarda yine de Pydantic'in dataclasses sürümünü kullanmanız gerekebilir. Örneğin, otomatik oluşturulan API dokümantasyonunda hata alıyorsanız.
Bu durumda standart dataclasses yerine, drop-in replacement olan pydantic.dataclasses kullanabilirsiniz:
from dataclasses import field # (1)
from fastapi import FastAPI
from pydantic.dataclasses import dataclass # (2)
@dataclass
class Item:
name: str
description: str | None = None
@dataclass
class Author:
name: str
items: list[Item] = field(default_factory=list) # (3)
app = FastAPI()
@app.post("/authors/{author_id}/items/", response_model=Author) # (4)
async def create_author_items(author_id: str, items: list[Item]): # (5)
return {"name": author_id, "items": items} # (6)
@app.get("/authors/", response_model=list[Author]) # (7)
def get_authors(): # (8)
return [ # (9)
{
"name": "Breaters",
"items": [
{
"name": "Island In The Moon",
"description": "A place to be playin' and havin' fun",
},
{"name": "Holy Buddies"},
],
},
{
"name": "System of an Up",
"items": [
{
"name": "Salt",
"description": "The kombucha mushroom people's favorite",
},
{"name": "Pad Thai"},
{
"name": "Lonely Night",
"description": "The mostests lonliest nightiest of allest",
},
],
},
]
🤓 Other versions and variants
from dataclasses import field # (1)
from typing import Union
from fastapi import FastAPI
from pydantic.dataclasses import dataclass # (2)
@dataclass
class Item:
name: str
description: Union[str, None] = None
@dataclass
class Author:
name: str
items: list[Item] = field(default_factory=list) # (3)
app = FastAPI()
@app.post("/authors/{author_id}/items/", response_model=Author) # (4)
async def create_author_items(author_id: str, items: list[Item]): # (5)
return {"name": author_id, "items": items} # (6)
@app.get("/authors/", response_model=list[Author]) # (7)
def get_authors(): # (8)
return [ # (9)
{
"name": "Breaters",
"items": [
{
"name": "Island In The Moon",
"description": "A place to be playin' and havin' fun",
},
{"name": "Holy Buddies"},
],
},
{
"name": "System of an Up",
"items": [
{
"name": "Salt",
"description": "The kombucha mushroom people's favorite",
},
{"name": "Pad Thai"},
{
"name": "Lonely Night",
"description": "The mostests lonliest nightiest of allest",
},
],
},
]
-
fieldhâlâ standartdataclassesiçinden import edilir. -
pydantic.dataclasses,dataclassesiçin bir drop-in replacement'tır. -
Authordataclass'ı,Itemdataclass'larından oluşan bir liste içerir. -
Authordataclass'ı,response_modelparametresi olarak kullanılır. -
Request body olarak dataclass'larla birlikte diğer standart type annotation'ları da kullanabilirsiniz.
Bu örnekte,
Itemdataclass'larından oluşan bir listedir. -
Burada
itemsiçeren bir dictionary döndürüyoruz;itemsbir dataclass listesi.FastAPI, veriyi JSON'a serializing etmeyi yine başarır.
-
Burada
response_model,Authordataclass'larından oluşan bir listenin type annotation'ını kullanıyor.Yine
dataclassesile standart type annotation'ları birleştirebilirsiniz. -
Bu path operation function,
async defyerine normaldefkullanıyor.Her zaman olduğu gibi, FastAPI'de ihtiyaca göre
defveasync def’i birlikte kullanabilirsiniz.Hangisini ne zaman kullanmanız gerektiğine dair hızlı bir hatırlatma isterseniz,
asyncveawait{.internal-link target=blank} dokümanındaki _"In a hurry?" bölümüne bakın. -
Bu path operation function dataclass döndürmüyor (isterse döndürebilir), onun yerine dahili verilerle bir dictionary listesi döndürüyor.
FastAPI, response'u dönüştürmek için (dataclass'ları içeren)
response_modelparametresini kullanacaktır.
Karmaşık veri yapıları oluşturmak için dataclasses ile diğer type annotation'ları pek çok farklı kombinasyonda birleştirebilirsiniz.
Daha spesifik ayrıntılar için yukarıdaki kod içi annotation ipuçlarına bakın.
Daha Fazla Öğrenin¶
dataclasses'ı diğer Pydantic model'leriyle de birleştirebilir, onlardan kalıtım alabilir, kendi model'lerinize dahil edebilirsiniz, vb.
Daha fazlası için Pydantic'in dataclasses dokümantasyonuna bakın.
Sürüm¶
Bu özellik FastAPI 0.67.0 sürümünden beri mevcuttur. 🔖