¿Hay alguna forma de convertir un modelo pydantic en parámetros de consulta en fastapi?
Algunos de mis puntos finales pasan parámetros a través del cuerpo, pero otros los pasan directamente en la consulta. Todos estos puntos finales comparten el mismo modelo de datos, por ejemplo:
class Model(BaseModel): x: str y: str Me gustaría evitar duplicar mi definición de este modelo en la definición de mis "puntos finales de parámetros de consulta", como por ejemplo test_query en este código:
class Model(BaseModel): x: str y: str @app.post("/test-body") def test_body(model: Model): pass @app.post("/test-query-params") def test_query(x: str, y: str): pass¿Cuál es la forma más limpia de hacer esto?
La documentación da un atajo para evitar este tipo de repeticiones. En este caso, daría:
from fastapi import Depends @app.post("/test-query-params") def test_query(model: Model = Depends()): pass Esto le permitirá solicitar /test-query-params?x=1&y=2 y también producirá la descripción correcta de OpenAPI para este punto final.
Se pueden usar soluciones similares para usar modelos Pydantic como descriptores de datos de formulario.
Esta solución es muy adecuada si su esquema es "mínimo" .
Pero, cuando se trata de uno complicado como este, establezca la descripción del parámetro de consulta en el documento swagger usando el modelo Pydantic , es mejor usar una "clase de dependencia personalizada"
from fastapi import Depends, FastAPI, Query app = FastAPI() class Model: def __init__( self, y: str, x: str = Query( default='default for X', title='Title for X', deprecated=True ) ): self.x = x self.y = y @app.post("/test-body") def test_body( model: Model = Depends() ): return modelSi está utilizando este método, tendrá más control sobre el documento de OpenAPI.