¿Alguien puede decirme cómo funciona el código del modelo pydantic a continuación sin instanciar el objeto de clase UserIn y UserOut? ¿Es esto algo manejado internamente por la biblioteca pydantic?
from typing import Optional from fastapi import FastAPI from pydantic import BaseModel, EmailStr app = FastAPI() class UserIn(BaseModel): username: str password: str email: EmailStr full_name: Optional[str] = None class UserOut(BaseModel): username: str email: EmailStr full_name: Optional[str] = None class UserInDB(BaseModel): username: str hashed_password: str email: EmailStr full_name: Optional[str] = None def fake_password_hasher(raw_password: str): return "supersecret" + raw_password def fake_save_user(user_in: UserIn): hashed_password = fake_password_hasher(user_in.password) user_in_db = UserInDB(**user_in.dict(), hashed_password=hashed_password) print("User saved! ..not really") return user_in_db @app.post("/user/", response_model=UserOut) async def create_user(user_in: UserIn): user_saved = fake_save_user(user_in) print(user_saved.__dict__) return user_savedNo necesita instanciar los objetos en su código porque FastAPI los crea automáticamente para esquemas dinámicos en ambos casos.
Para los argumentos de los métodos de punto final que son modelos de Pydantic como user_in: UserIn en su ejemplo, se interpreta como un cuerpo de solicitud, como se explica en los documentos aquí . Vale la pena señalar la explicación sobre cómo funciona el enlace de datos de entrada para los parámetros de punto final en la documentación de FastAPI :
- Si el parámetro también se declara en la ruta, se utilizará como parámetro de ruta.
- Si el parámetro es de un tipo singular (como int, float, str, bool, etc.) se interpretará como un parámetro de consulta.
- Si se declara que el parámetro es del tipo de un modelo Pydantic, se interpretará como un cuerpo de solicitud.
Para la salida del punto final, cuando defina el modelo de response_model , también lo convertirá, como se explica en la documentación aquí :
FastAPI utilizará este modelo de respuesta para:
- Convierta los datos de salida a su declaración de tipo.
- Validar los datos.
- Agregue un esquema JSON para la respuesta, en la operación de ruta de OpenAPI.
- Será utilizado por los sistemas automáticos de documentación.