"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > फास्टएपीआई: क्वेरी पैरामीटर घोषित करने के लिए पाइडेंटिक का उपयोग कैसे करें

फास्टएपीआई: क्वेरी पैरामीटर घोषित करने के लिए पाइडेंटिक का उपयोग कैसे करें

2024-11-19 को प्रकाशित
ब्राउज़ करें:678

यह लगभग तीन सप्ताह पहले सामने आया, यह फास्टएपीआई की सबसे अपेक्षित सुविधाओं में से एक है। कम से कम जब हम पाइडेंटिक मॉडल फास्टएपीआई के बारे में बात कर रहे हैं।

हां, मैं आपके क्वेरी पैरामीटर को मैप करने के लिए पाइडेंटिक मॉडल का उपयोग करने की क्षमता के बारे में बात कर रहा हूं।

तो इस पोस्ट में, मैं आपको वह सब दिखाने की कोशिश करूंगा? कर सकते हैं और? इस विषय पर कुछ नहीं कर सकते?:

? क्वेरी पैरामीटर्स का मानचित्रण

पाइडेंटिक के साथ अपने क्वेरी पैरामीटर्स को मैप करना शुरू करने के लिए आपको सबसे पहले यह सुनिश्चित करना होगा कि आप फास्टएपीआई संस्करण 0.115.0 का उपयोग कर रहे हैं।

इसके बाद, आप हमेशा फास्टएपीआई डॉक्स पर जाकर देख सकते हैं कि क्या पहले से उपलब्ध है। सेबस्टियन और टीम के सदस्य दस्तावेज़ों को अद्यतन और जानकारीपूर्ण बनाए रखने पर वास्तव में बहुत अच्छा काम करते हैं ✨।

? इतिहास का थोड़ा सा

आइए कुछ उदाहरणों से शुरू करें कि हम फास्टएपीआई में क्वेरी पैरामीटर्स को कैसे मैप करते थे। ?

ऐसा करने का सबसे सरल तरीका होगा:

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def search(
    limit: int | None = 10,
    skip: int | None = 1,
    filter: str | None = None
):
    return {
        "limit": limit,
        "skip": skip,
        "filter": filter
    }

और अब आप बस कॉल कर सकते हैं:

GET http://localhost:8000/?limit=42&skip=12&filter=banana

लेकिन अगर हमने पहचान लिया कि इस क्वेरी पैरामीटर का उपयोग अन्य मार्गों में किया जाएगा, तो हम इसे कुछ इस तरह से अलग कर देंगे:

from typing import Any
from fastapi import Depends, FastAPI, Query

app = FastAPI()

async def pagination_query_string(
    limit: int | None = Query(10, ge=5, le=100),
    skip: int | None = Query(1, ge=1),
    filter: str | None = Query(None)
) -> dict[str, Any]:
    return {
        "limit": limit,
        "skip": skip,
        "filter": filter
    }

@app.get("/")
async def search(q: dict[str, Any] = Depends(pagination_query_string)):
    return q

या चूंकि हम अपने मॉडलों को मैप करने के लिए पाइडेंटिक का उपयोग कर रहे हैं, बस थोड़ी सी रीफैक्टरिंग के साथ हमें यह मिलेगा:

from fastapi import Depends, FastAPI, Query
from pydantic import BaseModel

app = FastAPI()

class PaginationQueryString(BaseModel):
    limit: int | None = 10
    skip: int | None = 1
    filter: str | None = None

async def pagination_query_string(
    limit: int | None = Query(10, ge=5, le=100),
    skip: int | None = Query(1, ge=1),
    filter: str | None = Query(None)
) -> PaginationQueryString:
    return PaginationQueryString(
        limit=limit,
        skip=skip,
        filter=filter
    )

@app.get("/")
async def search(q: PaginationQueryString = Depends(pagination_query_string)):
    return q

⌨️ क्वेरी स्ट्रिंग्स को मैप करने के लिए पाइडेंटिक का उपयोग करना

FastAPI: How to use Pydantic to declare Query Parameters

अब, यदि हम अपनी क्वेरी स्ट्रिंग प्राप्त करना चाहते हैं, तो हमें कोई फ़ंक्शन बनाने और फिर इसे निर्भरता के रूप में जोड़ने की आवश्यकता नहीं है। हम बस फास्टएपीआई को बता सकते हैं कि हमें PaginationQueryString प्रकार का एक ऑब्जेक्ट चाहिए और यह एक क्वेरी स्ट्रिंग है:

from typing import Annotated
from fastapi import FastAPI, Query
from pydantic import BaseModel

app = FastAPI()

class PaginationQueryString(BaseModel):
    limit: int | None = 10
    skip: int | None = 1
    filter: str | None = None

@app.get("/")
async def search(q: Annotated[PaginationQueryString, Query()]):
    return q

आसान, है ना? ?

⚠️ सीमाएँ क्या हैं?

कम से कम संस्करण 0.115.0 पर, यह नेस्टेड मॉडलों के साथ बहुत अच्छी तरह से काम नहीं करता है।

आइए कुछ ऐसा प्रयास करें:

from typing import Annotated
from fastapi import FastAPI, Query
from pydantic import BaseModel

app = FastAPI()

class Filter(BaseModel):
    name: str | None = None
    age: int | None = None
    nickname: str | None = None

class PaginationQueryString(BaseModel):
    limit: int | None = 10
    skip: int | None = 1
    filter: Filter | None = None

@app.get("/")
async def search(q: Annotated[PaginationQueryString, Query()]):
    return q

अगर हम इसे पहले की तरह कहें:

GET http://localhost:8000/?limit=42&skip=12&filter=chocolate

हमें यह बताने में त्रुटि मिलेगी कि फ़िल्टर एक ऑब्जेक्ट है:

{
    "detail": [
        {
            "type": "model_attributes_type",
            "loc": [
                "query",
                "filter"
            ],
            "msg": "Input should be a valid dictionary or object to extract fields from",
            "input": "chocolate"
        }
    ]
}

कम से कम अभी, यह बिल्कुल सही है! हमने अपने फ़िल्टर को एक पाइडेंटिक मॉडल के रूप में बदल दिया, न कि एक स्ट्रिंग के रूप में। लेकिन अगर हम इसे एक शब्दकोश में बदलने का प्रयास करें:

http://localhost:8000/?limit=42&skip=12&filter={"name": "Rafael", "age": 38, "nickname": "ceb10n"}

FastAPI हमें बताएगा कि फ़िल्टर को एक वैध शब्दकोश होना चाहिए?:

{
    "detail": [
        {
            "type": "model_attributes_type",
            "loc": [
                "query",
                "filter"
            ],
            "msg": "Input should be a valid dictionary or object to extract fields from",
            "input": "{\"name\": \"Rafael\", \"age\": 38, \"nickname\": \"ceb10n\"}"
        }
    ]
}

ऐसा इसलिए हो रहा है क्योंकि फास्टएपीआई स्टारलेट के क्वेरीपैराम्स पर निर्भर करेगा, जो फास्टएपीआई को एक स्ट्रिंग देगा, कोई निर्देश नहीं। और कम से कम संस्करण 0.115.0 में, यह आपको एक त्रुटि देगा।

⁉️ तो, मैं अपने क्वेरी पैरामीटर्स के साथ पाइडेंटिक मॉडल का उपयोग कब करूं?

यह काफी सरल है:

✅ आपके पास सरल क्वेरी स्ट्रिंग हैं जिनके लिए किसी विस्तृत फैंसी नेस्टेड ऑब्जेक्ट की आवश्यकता नहीं है? इसका इस्तेमाल करें! ?

❌ आपने एक जटिल नेस्टेड क्वेरी स्ट्रिंग बनाई है? अभी तक इसका उपयोग न करें? (और शायद आपको अपनी क्वेरी स्ट्रिंग्स पर पुनर्विचार करने का प्रयास करना चाहिए।? जितना सरल, उतना बेहतर?)

विज्ञप्ति वक्तव्य यह आलेख यहां पुन: प्रस्तुत किया गया है: https://dev.to/ceb10n/fastapi-how-to-use-pydantic-to-declare-query-parameters-25bd?1 यदि कोई उल्लंघन है, तो कृपया [email protected] पर संपर्क करें इसे हटाने के लिए
नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3