Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

700
Vistas
Referencias circulares FastAPI / Pydantic en archivos separados

Me encantaría usar un esquema similar al siguiente en FastAPI:

 from __future__ import annotations from typing import List from pydantic import BaseModel class Project(BaseModel): members: List[User] class User(BaseModel): projects: List[Project] Project.update_forward_refs()

pero para mantener limpia la estructura de mi proyecto, ofc. quisiera definirlos en archivos separados. ¿Cómo podría hacer esto sin crear una referencia circular?

Con el código anterior, la generación de esquemas en FastAPI funciona bien, simplemente no sé cómo separarlo en archivos separados. En un paso posterior, en lugar de usar atributos, usaría @property s para definir los captadores para estos objetos en subclases de ellos. Pero para la generación de documentos OpenAPI, necesito esto combinado, creo.

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Hay tres casos en los que la dependencia circular puede funcionar en Python:

  • Parte superior del módulo: import package.module
  • Parte inferior del módulo: from package.module import attribute
  • Parte superior de la función: funciona tanto

En su situación, el segundo caso, "parte inferior del módulo", ayudará. Porque necesita usar la función update_forward_refs para resolver anotaciones pospuestas de pydantic como esta:

 # project.py from typing import List from pydantic import BaseModel class Project(BaseModel): members: "List[User]" from user import User Project.update_forward_refs()
 # user.py from typing import List from pydantic import BaseModel class User(BaseModel): projects: "List[Project]" from project import Project User.update_forward_refs()

No obstante, le recomiendo encarecidamente que no introduzca dependencias circulares de forma intencionada.

over 4 years ago · Santiago Trujillo Denunciar

0

Si quiero dividir los modelos/esquema en archivos separados, crearé archivos adicionales para el modelo ProjectBase y el modelo UserBase para que el modelo Project y el modelo User puedan heredar de ellos. Haré así:

 #project_base.py from pydantic import BaseModel class ProjectBase(BaseModel): id: int title: str class Config: orm_mode=True

 #user_base.py from pydantic import BaseModel class UserBase(BaseModel): id: int title: str class Config: orm_mode=True

 #project.py from typing import List from .project_base import ProjectBase from .user_base import UserBase class Project(ProjectBase): members: List[UserBase] = []

 #user.py from typing import List from .project_base import ProjectBase from .user_base import UserBase class User(UserBase): projects: List[ProjectBase] = []

nota: para este método, orm_mode debe colocarse en ProjectBase y UserBase, para que pueda leerse por Proyecto y Usuario incluso si no es un dict

over 4 years ago · Santiago Trujillo Denunciar

0

Simplemente coloque todas sus imports de esquema en la parte inferior del archivo , después de todas las clases, y llame a update_forward_refs() .

 #1/4 from __future__ import annotations # this is important to have at the top from pydantic import BaseModel #2/4 class A(BaseModel): my_x: X # a pydantic schema from another file class B(BaseModel): my_y: Y # a pydantic schema from another file class C(BaseModel): my_z: int #3/4 from myapp.schemas.x import X # related schemas we import after all classes from myapp.schemas.y import Y #4/4 A.update_forward_refs() # tell the system that A has a related pydantic schema B.update_forward_refs() # tell the system that B has a related pydantic schema # for C we don't need it, because C has just an integer field.

NOTA: Haga esto en cada archivo que tenga importaciones de esquema. Eso te permitirá hacer cualquier combinación sin problemas de importación circular.

NOTA 2: Las personas generalmente colocan imports y update_forward_refs() después de cada class y luego informan que no funciona. Por lo general, eso se debe a que, si una aplicación es compleja, no sabe qué import está llamando a qué class y cuándo. Por lo tanto, si lo coloca en la parte inferior, está seguro de que cada class será 'escaneada' y visible para los demás.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda