Configuración:
# Pydantic Models class TMDB_Category(BaseModel): name: str = Field(alias="strCategory") description: str = Field(alias="strCategoryDescription") class TMDB_GetCategoriesResponse(BaseModel): categories: list[TMDB_Category] @router.get(path="category", response_model=TMDB_GetCategoriesResponse) async def get_all_categories(): async with httpx.AsyncClient() as client: response = await client.get(Endpoint.GET_CATEGORIES) return TMDB_GetCategoriesResponse.parse_obj(response.json()) Problema:
El alias se usa al crear una respuesta y quiero evitarlo. Solo necesito este alias para mapear correctamente los datos entrantes, pero cuando devuelvo una respuesta, quiero usar nombres de campo reales.
Respuesta real:
{ "categories": [ { "strCategory": "Beef", "strCategoryDescription": "Beef is ..." }, { "strCategory": "Chicken", "strCategoryDescription": "Chicken is ..." } }Respuesta esperada:
{ "categories": [ { "name": "Beef", "description": "Beef is ..." }, { "name": "Chicken", "description": "Chicken is ..." } }Cambie los alias y los nombres de los campos y use la opción de configuración del modelo allow_population_by_field_name :
class TMDB_Category(BaseModel): strCategory: str = Field(alias="name") strCategoryDescription: str = Field(alias="description") class Config: allow_population_by_field_name = True Deje que los alias configuren los nombres de los campos que desea devolver, pero habilite allow_population_by_field_name para poder analizar datos que usan diferentes nombres para los campos.
tal vez podrías usar este enfoque
from pydantic import BaseModel, Field class TMDB_Category(BaseModel): name: str = Field(alias="strCategory") description: str = Field(alias="strCategoryDescription") data = { "strCategory": "Beef", "strCategoryDescription": "Beef is ..." } obj = TMDB_Category.parse_obj(data) # {'name': 'Beef', 'description': 'Beef is ...'} print(obj.dict())