Pydantic-fältvalidering och validatorer
Utforska avancerade alternativ för fältvalidering och skapa anpassade validatorer för komplexa affärsregler.
Pydantic-fältvalidering och validatorer är en gratis lektion i Bootcamp i backendutveckling med FastAPI på CoddyKit. Detta är lektion 1 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Bootcamp i backendutveckling med FastAPI, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Bootcamp i backendutveckling med FastAPI innehåller totalt 4 lektioner.
Varför validera med Pydantic?
Pydantic validerar automatiskt datatyperna i dina modeller. Ibland behöver du dock mer specifika regler, till exempel en minsta längd för ett användarnamn eller en positiv ålder.
Det är här fältvalidering och anpassade validatorer kommer in i bilden! De säkerställer att dina data uppfyller alla affärsregler i applikationen, vilket gör dina API:er mer tillförlitliga.
Använda Pydantics `Field`-funktion
Pydantics Field-funktion låter dig lägga till extra valideringsregler och metadata för modellfält. Den importeras från pydantic. Vi ska se hur du kan kräva en minsta och största längd för en sträng.
from pydantic import BaseModel, Field
class User(BaseModel):
username: str = Field(min_length=3, max_length=15)
age: int
# Valid
try:
user1 = User(username="coddy", age=25)
print(f"Valid username: {user1.username}")
except Exception as e:
print(e)
# Invalid username (too short)
try:
user2 = User(username="c", age=30)
except Exception as e:
print(f"Error: {e}")Regler för numeriska fält
För tal erbjuder Field kraftfulla jämförelsevalidatorer:
gt(större än)lt(mindre än)ge(större än eller lika med)le(mindre än eller lika med)
Använd dem för att definiera giltiga intervall för numeriska data och säkerställa att värdena alltid ligger inom de förväntade gränserna.
from pydantic import BaseModel, Field
class Product(BaseModel):
name: str
price: float = Field(gt=0, le=1000) # Price > 0 and <= 1000
stock: int = Field(ge=0) # Stock >= 0
# Valid
try:
product1 = Product(name="Book", price=19.99, stock=100)
print(f"{product1.name} price: {product1.price}")
except Exception as e:
print(e)
# Invalid price (negative)
try:
product2 = Product(name="Pen", price=-5.0, stock=50)
except Exception as e:
print(f"Error: {e}")Regex för fältvalidering
Argumentet pattern i Field låter dig validera strängfält mot ett reguljärt uttryck. Det passar utmärkt när du vill kräva specifika format, till exempel produktkoder, serienummer eller komplexa identifierare.
from pydantic import BaseModel, Field
class ItemCode(BaseModel):
# Code must be three uppercase letters, a hyphen, then four digits
code: str = Field(pattern=r"^[A-Z]{3}-\d{4}$") # e.g., ABC-1234
# Valid
try:
item1 = ItemCode(code="XYZ-9876")
print(f"Valid code: {item1.code}")
except Exception as e:
print(f"Error: {e}")
# Invalid format (lowercase letters)
try:
item2 = ItemCode(code="abc-1234")
except Exception as e:
print(f"Error: {e}")Skapa anpassade validatorer
Även om Field täcker många vanliga fall behöver du ibland mer komplex valideringslogik som innehåller anpassad Python-kod. Det är här Pydantics dekorator @validator kommer till sin rätt.
Du kan definiera en metod i din BaseModel och dekorera den med @validator('field_name') för att tillämpa anpassad logik på just det fältet.
Anpassad logik för fält
Vi ska skapa en anpassad validator som säkerställer att fältet password uppfyller särskilda komplexitetskrav, till exempel att det innehåller minst en siffra. Validatorfunktionen tar emot fältets värde som argument.
from pydantic import BaseModel, validator
import re
class UserAuth(BaseModel):
username: str
password: str
@validator('password')
def password_has_digit(cls, v):
if not re.search(r"\d", v):
raise ValueError('password must contain at least one digit')
return v
# Valid
try:
user1 = UserAuth(username="coder", password="MySecureP@ss1")
print(f"Password OK for {user1.username}")
except Exception as e:
print(f"Error: {e}")
# Invalid password (no digits)
try:
user2 = UserAuth(username="test", password="NoDigitsHere!")
except Exception as e:
print(f"Error: {e}")Datatransformering med `pre=True`
Ibland behöver du omforma eller rensa inkommande data innan Pydantics vanliga typvalidering eller andra validatorer körs. Använd då @validator('field_name', pre=True).
Ett vanligt användningsområde är att ta bort blanksteg eller ändra skiftläge innan innehållet valideras, så att det blir konsekvent.
from pydantic import BaseModel, validator
class SearchQuery(BaseModel):
query: str
@validator('query', pre=True)
def strip_whitespace(cls, v):
if isinstance(v, str):
return v.strip()
return v # Pydantic will handle type validation later
# Input with leading/trailing spaces
query1 = SearchQuery(query=" python tutorial ")
print(f"Cleaned query: '{query1.query}'")
# Input without spaces
query2 = SearchQuery(query="fastapi")
print(f"Cleaned query: '{query2.query}'")Kedja fältvalidatorer
Du kan använda flera @validator-dekoratorer på ett och samma fält. De körs i den ordning de definieras. På så sätt kan du kedja valideringslogik och göra dina modeller robusta.
För listfält använder du each_item=True för att tillämpa validatorn på varje element i listan.
from pydantic import BaseModel, validator
class TagList(BaseModel):
tags: list[str]
@validator('tags', each_item=True)
def tag_must_be_lowercase(cls, v):
if v != v.lower():
raise ValueError('tag must be lowercase')
return v
@validator('tags', each_item=True)
def tag_min_length(cls, v):
if len(v) < 2:
raise ValueError('tag must be at least 2 chars')
return v
# Valid
try:
tags1 = TagList(tags=["python", "fastapi"])
print(f"Tags OK: {tags1.tags}")
except Exception as e:
print(f"Error: {e}")
# Invalid (uppercase and too short)
try:
tags2 = TagList(tags=["PY", "a"])
except Exception as e:
print(f"Error: {e}")Validering mellan fält med root-validatorer
Ibland beror giltigheten för ett fält på värdet i ett annat fält (eller flera andra). Detta kallas validering mellan fält. Pydantics @root_validator låter dig validera hela modellens dataordbok på en gång.
Det är användbart i situationer där du till exempel vill säkerställa att start_date infaller före end_date, eller att password och confirm_password överensstämmer.
Root-validator i praktiken
@root_validator tar emot hela modellens data som en ordbok. Du kan använda pre=True eller pre=False (standardvärdet) för att köra före eller efter den fältspecifika valideringen. Eftervalidering (standardvärdet) är vanligtvis att föredra vid kontroller mellan fält.
from pydantic import BaseModel, root_validator, ValidationError
class Registration(BaseModel):
email: str
password: str
password_confirm: str
@root_validator()
def passwords_match(cls, values):
pw1, pw2 = values.get('password'), values.get('password_confirm')
if pw1 is not None and pw2 is not None and pw1 != pw2:
raise ValueError('passwords do not match')
return values
# Valid
try:
reg1 = Registration(email="a@b.com", password="P@ssword1", password_confirm="P@ssword1")
print("Registration valid!")
except ValidationError as e:
print(f"Error: {e}")
# Invalid (passwords don't match)
try:
reg2 = Registration(email="x@y.com", password="P@ssword1", password_confirm="P@ssword2")
except ValidationError as e:
print(f"Error: {e}")Valideringskontroll
Betrakta följande Pydantic-modell för en användarprofil:
from pydantic import BaseModel, Field, validator
import re
class UserProfile(BaseModel):
username: str = Field(min_length=5, max_length=20)
email: str
age: int = Field(gt=18)
bio: str = ""
@validator('email')
def validate_email_format(cls, v):
if not re.match(r"[^@]+@[^@]+\.[^@]+", v):
raise ValueError('Invalid email format')
return vVilken av följande JSON-indata skulle vara giltig för UserProfile?
Sammanfattning: Bemästra validering
Du har lärt dig att göra dina datamodeller verkligt robusta!
Field: För inbyggda regler som minsta och största längd, numeriska intervall och regex-mönster.@validator: För att implementera anpassad logik för enskilda fält, medpre=Trueför tidig transformering.@root_validator: För komplex validering mellan fält som beror på flera fält.
Med dessa verktyg kan du definiera exakta regler och säkerställa dataintegriteten i dina FastAPI-applikationer. Fortsätt öva för att bygga ännu mer tillförlitliga API:er!
Lär dig Bootcamp i backendutveckling med FastAPI med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 21
- Lektioner
- 84
Vanliga frågor
Är lektionen ”Pydantic-fältvalidering och validatorer” gratis?
Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Bootcamp i backendutveckling med FastAPI, inklusive ”Pydantic-fältvalidering och validatorer”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Bootcamp i backendutveckling med FastAPI innehåller totalt 4 lektioner.
Vad lär jag mig i ”Pydantic-fältvalidering och validatorer”?
Utforska avancerade alternativ för fältvalidering och skapa anpassade validatorer för komplexa affärsregler. Ni övar på Bootcamp i backendutveckling med FastAPI med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Bootcamp i backendutveckling med FastAPI?
Du behöver inga förkunskaper. Utbildningen i Bootcamp i backendutveckling med FastAPI på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 1 av 4.
Hur lång tid tar lektionen ”Pydantic-fältvalidering och validatorer”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Bootcamp i backendutveckling med FastAPI-lektionen?
Ja. Varje Bootcamp i backendutveckling med FastAPI-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Pydantic-fältvalidering och validatorer
- Anpassade datatyper och inställningar
- Nästadade modeller och rekursiva strukturer
- Serialisering med model_dump och alias