Ana içeriğe geç

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.

English version

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",
                },
            ],
        },
    ]
  1. field hâlâ standart dataclasses içinden import edilir.

  2. pydantic.dataclasses, dataclasses için bir drop-in replacement'tır.

  3. Author dataclass'ı, Item dataclass'larından oluşan bir liste içerir.

  4. Author dataclass'ı, response_model parametresi olarak kullanılır.

  5. Request body olarak dataclass'larla birlikte diğer standart type annotation'ları da kullanabilirsiniz.

    Bu örnekte, Item dataclass'larından oluşan bir listedir.

  6. Burada items içeren bir dictionary döndürüyoruz; items bir dataclass listesi.

    FastAPI, veriyi JSON'a serializing etmeyi yine başarır.

  7. Burada response_model, Author dataclass'larından oluşan bir listenin type annotation'ını kullanıyor.

    Yine dataclasses ile standart type annotation'ları birleştirebilirsiniz.

  8. Bu path operation function, async def yerine normal def kullanıyor.

    Her zaman olduğu gibi, FastAPI'de ihtiyaca göre def ve async def’i birlikte kullanabilirsiniz.

    Hangisini ne zaman kullanmanız gerektiğine dair hızlı bir hatırlatma isterseniz, async ve await{.internal-link target=blank} dokümanındaki _"In a hurry?" bölümüne bakın.

  9. 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_model parametresini 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. 🔖