गतिशील फ़िल्टरिंग और क्रमबद्धता पैरामीटर
सत्यापन के साथ फ़िल्टरिंग, क्रमबद्धता और फ़ील्ड चयन के लिए पुनः उपयोग योग्य क्वेरी-पैरामीटर मॉडल बनाइए।
गतिशील फ़िल्टरिंग और क्रमबद्धता पैरामीटर, CoddyKit पर FastAPI बैकएंड डेवलपमेंट बूटकैंप का एक निःशुल्क पाठ है। यह 4 में से 3वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह FastAPI बैकएंड डेवलपमेंट बूटकैंप सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। FastAPI बैकएंड डेवलपमेंट बूटकैंप पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
डायनेमिक क्वेरी पैरामीटर क्यों?
वास्तविक दुनिया के सूची एंडपॉइंट शायद ही कभी सब कुछ लौटाते हैं। क्लाइंट फ़िल्टर करना चाहते हैं (केवल सक्रिय उपयोगकर्ता), क्रमबद्ध करना चाहते हैं (सबसे नए पहले) और फ़ील्ड चुनना चाहते हैं (केवल id और नाम)। हर संयोजन को हार्डकोड करने से आपके रूटों की संख्या बहुत बढ़ जाती है।
साफ़ तरीका यह है कि इन क्वेरी पैरामीटरों को पुनः उपयोग योग्य, सत्यापित ऑब्जेक्ट के रूप में मॉडल किया जाए, जिन्हें कई एंडपॉइंट में इंजेक्ट किया जा सके। इस पाठ में हम बनाएँगे:
- एक फ़िल्टर मॉडल, जो क्वेरी पैरामीटरों को सुरक्षित प्रतिबंधों में बदलता है
- फ़ील्ड और दिशाओं की अनुमत सूची वाला क्रमबद्धता पार्सर
- प्रतिक्रिया के डेटा को छोटा करने के लिए फ़ील्ड चयन तंत्र
सब कुछ FastAPI निर्भरताओं द्वारा संचालित होता है, इसलिए यह DRY और परीक्षण योग्य रहता है।
निर्भरता क्लास से फ़िल्टर एकत्र करना
Query पैरामीटर लेने वाली __init__ वाली क्लास पुनः उपयोग योग्य निर्भरता बन जाती है। FastAPI प्रत्येक पैरामीटर को URL से पढ़ता है और उसे OpenAPI में अपने-आप दर्ज करता है।
Optional[...] = None का उपयोग करें, ताकि फ़िल्टर वैकल्पिक रहें: पैरामीटर न होने का अर्थ है कि उस कॉलम पर फ़िल्टर न लगाया जाए।
from typing import Optional
from fastapi import Query
class UserFilterParams:
def __init__(
self,
status: Optional[str] = Query(None, description="active | inactive"),
min_age: Optional[int] = Query(None, ge=0, le=150),
search: Optional[str] = Query(None, min_length=2, max_length=50),
):
self.status = status
self.min_age = min_age
self.search = search
# Usage:
# @app.get('/users')
# def list_users(filters: UserFilterParams = Depends()):
# ...Enum से फ़िल्टर मानों का सत्यापन
status=foo जैसे मुक्त-पाठ फ़िल्टर गलत इनपुट को अंदर आने देते हैं। उन्हें str-आधारित Enum से सीमित करें: FastAPI अनुमत समूह से बाहर के मानों को अस्वीकार करता है और दस्तावेज़ों में ड्रॉपडाउन दिखाता है।
यह सुरक्षा की पहली पंक्ति है — अमान्य फ़िल्टर मान क्वेरी परत में पहुँचने के बजाय साफ़ 422 त्रुटि देते हैं।
from enum import Enum
from typing import Optional
from fastapi import Query
class UserStatus(str, Enum):
active = "active"
inactive = "inactive"
pending = "pending"
class UserFilterParams:
def __init__(
self,
status: Optional[UserStatus] = Query(None),
min_age: Optional[int] = Query(None, ge=0, le=150),
):
self.status = status
self.min_age = min_ageफ़िल्टर को प्रेडिकेट में बदलना
HTTP परत को डेटा परत से अलग रखें। निर्भरता केवल एकत्र और सत्यापित करती है; एक छोटी सहायक प्रक्रिया भरे हुए ऑब्जेक्ट को वास्तविक फ़िल्टर प्रेडिकेट में बदलती है।
यहाँ फ़्रेमवर्क से स्वतंत्र संस्करण है, जिसे आप साधारण डिक्शनरी पर फ़िल्टर लगाकर चला सकते हैं। यही तरीका बाद में SQLAlchemy के .filter() कॉल पर भी आसानी से लागू किया जा सकता है।
USERS = [
{"id": 1, "name": "Ada", "status": "active", "age": 36},
{"id": 2, "name": "Linus", "status": "inactive", "age": 54},
{"id": 3, "name": "Grace", "status": "active", "age": 41},
]
def apply_filters(rows, status=None, min_age=None, search=None):
result = rows
if status is not None:
result = [r for r in result if r["status"] == status]
if min_age is not None:
result = [r for r in result if r["age"] >= min_age]
if search is not None:
result = [r for r in result if search.lower() in r["name"].lower()]
return result
print(apply_filters(USERS, status="active", min_age=40))क्रमबद्धता पैरामीटर को पार्स करना
एक सामान्य अनुबंध है ?sort=-created_at,name: अल्पविराम से अलग की गई सूची, जिसमें शुरुआत का - अवरोही क्रम दर्शाता है। इसे (field, direction) टपल में पार्स करें।
क्लाइंट के फ़ील्ड नामों पर कभी भरोसा न करें। प्रत्येक फ़ील्ड को अनुमत सूची के विरुद्ध सत्यापित करें, ताकि उपयोगकर्ता मनमाने कॉलम पर क्रमबद्ध या उनकी जाँच न कर सकें।
ALLOWED_SORT = {"created_at", "name", "age", "id"}
def parse_sort(sort_param):
parsed = []
for token in sort_param.split(","):
token = token.strip()
if not token:
continue
descending = token.startswith("-")
field = token[1:] if descending else token
if field not in ALLOWED_SORT:
raise ValueError(f"Cannot sort by '{field}'")
parsed.append((field, "desc" if descending else "asc"))
return parsed
print(parse_sort("-created_at,name"))
print(parse_sort("age"))पुनः उपयोग योग्य क्रमबद्धता निर्भरता
पार्सर को एक निर्भरता में लपेटें, ताकि प्रत्येक सूची एंडपॉइंट समान क्रमबद्धता अनुबंध और सत्यापन साझा करे। गलत फ़ील्ड पर HTTPException(422) उठाने से क्लाइंट को सटीक, मशीन-पठनीय त्रुटि मिलती है।
अनुमत सूची को अंदर भेजने से यह निर्भरता अलग-अलग क्रमबद्ध किए जा सकने वाले कॉलम वाले संसाधनों में पुनः उपयोग योग्य बन जाती है।
from typing import Optional
from fastapi import Query, HTTPException
def sort_dependency(allowed: set):
def _parse(sort: Optional[str] = Query(None, example="-created_at,name")):
if not sort:
return []
parsed = []
for token in sort.split(","):
token = token.strip()
if not token:
continue
desc = token.startswith("-")
field = token[1:] if desc else token
if field not in allowed:
raise HTTPException(422, f"Invalid sort field: {field}")
parsed.append((field, "desc" if desc else "asc"))
return parsed
return _parse
# @app.get('/users')
# def list_users(sort=Depends(sort_dependency({'created_at','name'}))):
# ...मेमोरी में बहु-कुंजी क्रमबद्धता लागू करना
एकाधिक क्रमबद्धता कुंजियों को क्रम से लागू करना आवश्यक है। एक स्थिर उपाय है: पहले सबसे कम महत्वपूर्ण कुंजी के आधार पर क्रमबद्ध करें और फिर पीछे की ओर काम करें, क्योंकि Python का sorted स्थिर होता है।
यह स्वतंत्र उदाहरण उसी परिणाम को दर्शाता है जो डेटाबेस का ORDER BY a, b DESC देता।
ROWS = [
{"name": "Ada", "age": 36},
{"name": "Grace", "age": 36},
{"name": "Linus", "age": 54},
]
def apply_sort(rows, sort_keys):
result = list(rows)
for field, direction in reversed(sort_keys):
result.sort(key=lambda r: r[field], reverse=(direction == "desc"))
return result
ordered = apply_sort(ROWS, [("age", "desc"), ("name", "asc")])
for r in ordered:
print(r)फ़ील्ड चयन (विरल फ़ील्ड सेट)
डेटा-भार छोटा करने के लिए ?fields=id,name का समर्थन करें। क्लाइंट चुनता है कि कौन-सी कुंजियाँ वापस आएँ। हमेशा की तरह, दिखाई जा सकने वाले फ़ील्ड की अनुमत सूची के विरुद्ध सत्यापन करें, ताकि password_hash जैसे आंतरिक कॉलम कभी माँगे न जा सकें।
चयन एक प्रोजेक्शन चरण है, जिसे क्रमबद्धता और फ़िल्टरिंग के बाद, क्रमांकन से ठीक पहले लागू किया जाता है।
EXPOSABLE = {"id", "name", "status", "age"}
def select_fields(rows, fields_param):
if not fields_param:
return rows
requested = {f.strip() for f in fields_param.split(",") if f.strip()}
invalid = requested - EXPOSABLE
if invalid:
raise ValueError(f"Unknown fields: {sorted(invalid)}")
return [{k: r[k] for k in requested if k in r} for r in rows]
data = [{"id": 1, "name": "Ada", "status": "active", "age": 36}]
print(select_fields(data, "id,name"))फ़िल्टर, क्रमबद्धता, चयन और पेजिनेशन को मिलाना
पाइपलाइन का क्रम सहीपन और दक्षता के लिए महत्वपूर्ण है: पहले फ़िल्टर लगाकर समूह छोटा करें, फिर क्रमबद्ध करें, उसके बाद पृष्ठ बनाएँ (स्लाइस करें), और अंत में लौटाए जाने वाले पृष्ठ पर फ़ील्ड चुनें।
पेजिनेशन से पहले फ़ील्ड चुनने पर भी सब कुछ स्कैन करना पड़ेगा, और क्रमबद्धता से पहले पेजिनेशन करने पर गलत पृष्ठ लौटेगा।
def list_resource(rows, *, filters, sort_keys, fields, offset, limit,
apply_filters, apply_sort, select_fields):
rows = apply_filters(rows, **filters)
rows = apply_sort(rows, sort_keys)
total = len(rows)
page = rows[offset: offset + limit]
page = select_fields(page, fields)
return {"total": total, "items": page,
"offset": offset, "limit": limit}
# In FastAPI each piece is a Depends(); the route just calls list_resource.निर्भरताओं को एक क्वेरी ऑब्जेक्ट में संयोजित करना
हर रूट में चार अलग-अलग निर्भरताएँ भेजने के बजाय उन्हें संयोजित करें। एक रैपर निर्भरता फ़िल्टर, क्रमबद्धता कुंजियाँ, फ़ील्ड और पेजिनेशन रखने वाला एक सुव्यवस्थित ऑब्जेक्ट लौटा सकती है।
इससे रूट के हस्ताक्षर छोटे रहते हैं और क्वेरी अनुबंध को विकसित करने के लिए एक ही स्थान मिलता है।
from dataclasses import dataclass
from typing import Optional
from fastapi import Depends, Query
@dataclass
class ListQuery:
filters: object
sort: list
fields: Optional[str]
offset: int
limit: int
def list_query(
filters: "UserFilterParams" = Depends(),
sort: list = Depends(sort_dependency({"created_at", "name"})),
fields: Optional[str] = Query(None),
offset: int = Query(0, ge=0),
limit: int = Query(20, ge=1, le=100),
) -> ListQuery:
return ListQuery(filters, sort, fields, offset, limit)
# @app.get('/users')
# def list_users(q: ListQuery = Depends(list_query)):
# ...अनुबंध का दस्तावेज़ीकरण और डिफ़ॉल्ट मान तय करना
एक अच्छा क्वेरी अनुबंध स्वयं-दस्तावेज़ित और डिफ़ॉल्ट रूप से सुरक्षित होता है:
- हर
Queryकोdescriptionऔरexampleदें, ताकि OpenAPI दस्तावेज़ सिंटैक्स समझा सकें। limitपरle=100की सीमा लगाएँ, ताकि कोई क्लाइंट दस लाख पंक्तियों का अनुरोध न कर सके।- एक समझदारी भरा डिफ़ॉल्ट क्रम चुनें, जैसे सबसे नई प्रविष्टि पहले, ताकि पृष्ठों में परिणाम नियत रहें।
- अज्ञात फ़ील्ड या क्रमबद्ध करने वाली कुंजियों को चुपचाप अनदेखा करने के बजाय 422 के साथ अस्वीकार करें।
नियत क्रम अत्यंत महत्वपूर्ण है: स्थिर क्रम के बिना, अलग-अलग अनुरोधों के बीच पृष्ठांकन में पंक्तियाँ दोहराई या छूटी जा सकती हैं।
त्वरित जाँच: पाइपलाइन का क्रम
आप GET /products उपलब्ध कराते हैं, जिसमें फ़िल्टरिंग, क्रमबद्ध करना, पृष्ठांकन और विरल फ़ील्ड-समुच्चय समर्थित हैं। सही पृष्ठ को कुशलतापूर्वक लौटाने के लिए इन क्रियाओं को किस क्रम में लागू किया जाना चाहिए?
पुनरावलोकन
आपने FastAPI की सूची वाले एंडपॉइंट्स के लिए एक पुनःप्रयोग योग्य और मान्य क्वेरी परत बनाई:
- फ़िल्टर —
Optionalपैरामीटर औरEnum/प्रतिबंध सत्यापन वाली निर्भरता क्लास के रूप में। - क्रमबद्ध करना —
-field,fieldसिंटैक्स से पार्स किया गया, अनुमति-सूची के विरुद्ध जाँचा गया और अज्ञात फ़ील्ड पर 422 उत्पन्न किया गया। - फ़ील्ड चयन — आंतरिक कॉलमों की सुरक्षा के लिए प्रदर्शित किए जा सकने वाले अनुमति-सूची तक सीमित विरल फ़ील्ड-समुच्चय।
- एक संयुक्त
ListQueryनिर्भरता, जो रूट हस्ताक्षरों को साफ़-सुथरा रखती है।
पाइपलाइन याद रखें: फ़िल्टर → क्रमबद्ध करें → पृष्ठांकित करें → चयन करें। हमेशा एक नियत डिफ़ॉल्ट क्रम रखें, ताकि पृष्ठांकन सुसंगत रहे। जब आप मेमोरी में रखे डेटा से वास्तविक डेटाबेस पर जाएँगे, तो ये पैटर्न सीधे SQLAlchemy क्वेरी पर लागू किए जा सकते हैं।
एआई शिक्षक के साथ FastAPI बैकएंड डेवलपमेंट बूटकैंप सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 21
- पाठ
- 84
अक्सर पूछे जाने वाले प्रश्न
क्या “गतिशील फ़िल्टरिंग और क्रमबद्धता पैरामीटर” पाठ निःशुल्क है?
हाँ — FastAPI बैकएंड डेवलपमेंट बूटकैंप अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “गतिशील फ़िल्टरिंग और क्रमबद्धता पैरामीटर” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। FastAPI बैकएंड डेवलपमेंट बूटकैंप पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“गतिशील फ़िल्टरिंग और क्रमबद्धता पैरामीटर” में मैं क्या सीखूँगा?
सत्यापन के साथ फ़िल्टरिंग, क्रमबद्धता और फ़ील्ड चयन के लिए पुनः उपयोग योग्य क्वेरी-पैरामीटर मॉडल बनाइए। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ FastAPI बैकएंड डेवलपमेंट बूटकैंप का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या FastAPI बैकएंड डेवलपमेंट बूटकैंप शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर FastAPI बैकएंड डेवलपमेंट बूटकैंप शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 3वाँ पाठ है।
“गतिशील फ़िल्टरिंग और क्रमबद्धता पैरामीटर” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस FastAPI बैकएंड डेवलपमेंट बूटकैंप पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर FastAPI बैकएंड डेवलपमेंट बूटकैंप पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- URL, हेडर और मीडिया-प्रकार संस्करण निर्धारण
- बड़े पैमाने पर कर्सर बनाम ऑफसेट पृष्ठांकन
- गतिशील फ़िल्टरिंग और क्रमबद्धता पैरामीटर
- स्थिर प्रतिक्रिया आवरणों का डिज़ाइन