Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

701
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda