3
respostas

ValueError: attempted relative import beyond top-level package

Alguém sabe o porquê de eu não estar conseguindo importar um modelo que eu gerei em outro APP? Já consegui fazer isso antes, e agora está dando esse erro.

from ....apps.usuarios.models import FotoUsuario

Como o o modelo está em outro APP usei 4 pontos para chegar até a pasta local dele, depois importei. Alguém sabe como arrumar?

3 respostas

Oi Raul, como você está?

Sem ver sua estrutura de pastas fica incerto te mostrar uma sugestão que vá corrigir sua importação, mas o erro ocorre por o Python não consegue interpretar o caminho passado. Algo que pode verificar é se suas pastas possuem o arquivo __init__.py, para torná-la um pacote capaz de ser importado.

No geral, fazer imports relativos não é uma boa prática, pois fica obscuro saber de onde está vindo o arquivo, por exemplo: você consegue saber com exatidão de onde está vindo, mas, se eu for olhar exclusivamente esse trecho do seu código não consigo ter essa clareza, pois são apenas "pontos".

Fica mais claro quando colocamos o caminho completo, até mesmo para reforçar a estrutura da aplicação, por exemplo:

from outro_app.usuarios.models import FotoUsuario

Tente colocar o caminho completo e veja se o erro irá persistir.

Obs: caso você esteja utilizando o PyCharm, pode ocorrer dele preencher automaticamente com caminho relativo, porém, como executamos o arquivo no servidor, por vezes o Python não consegue interpretar o path daquela importação.

Qualquer dúvida estou por aqui, a gente vai conversando.

Abraços!

Creio que o erro tenha acontecido porque usei ...apps.usuarios.models para acessar o arquivo,

quando rodei

from usuarios.models import FotoUsuario, rodou normalmente. No caso, "usuarios" é meu outro app. O app que tem os 3 pontos é a pasta onde ficam todos os apps do projeto.

Que bom que deu certo, Raul! Dessa forma: from usuarios.models import FotoUsuario fica bem mais legível e evita erros de importação =)

Isso, o erro ocorreu pelo modo que você estava fazendo a importação anteriormente, essa forma anterior que você estava usando é chamada de import relativo e no geral, não é uma boa prática.