ここまで、あえて避けてきたのだが、あちこちのサイトで紹介されているコードを組み合わせようとすると、人によってディレクトリの構成やネーミングにばらつきがあったりで、部分的にコピーしてもうまく動かないことが多い。
なので、自分の構築している環境に合わせて書き換えていく必要があるわけで、そうすると相対インポートを避けてはいられない。
たとえば
database/ manage.py app/ static/ template/ views/ __init__.py home.py exome.py __init__.py config.py models.py
現在こんな構成になっているが
app/views/exome.pyの中には絶対パスで
from app.models import User, Exome
となっているが
models.pyはapp/views/exome.pyより一つ上の階層のディレクトリ(app/)にあるため
from ..models import User, Exome
と書くことができる。
これがちょっと前の構成のようにmodels.pyとexome.pyが同じディレクトリ内にある場合には
from .models import User, Exome
で良かったわけだ。
unixのコマンドでディレクトリ階層を指定するときに、同階層で./hogeというふうに書くのと似ている。
ただし./は省略できるがpythonのimportでは.は省略できないので注意が必要だ。
じゃあ
from .. import app
これは何?
この場合一つ上の階層にある__init__.pyに定義されたappをimportしていると考えられる。もしくは一つ上の階層にapp.pyがあるか。
参考
https://www.python.org/dev/peps/pep-0328/#guido-s-decision