とあるWeb予約システムをつくる際にひっかかった、
複数アプリで共通のテーブルを使いたい
場合のフォルダ構成アイデアです。
詳細はブログも参照ください。
【Django】Webアプリのフォルダ構成のアイデア〜違うアプリで同じテーブルを使いたい!
ViewとModelを同じ階層でつくればOK
Pythonの仕様で、import元は同階層か下の階層にある必要があるようです。
(裏技もあるようですが非推奨と思われます。)
ModelはViewから呼ばれるので、
ModelとViewが同階層か、Modelが下階層にあればOKです。
(venv) django_project$ tree
.
├── config #プロジェクト作成時の設定フォルダ
│ ├── __init__.py
│ ├── __pycache__
│ │ ├── __init__.cpython-36.pyc
│ │ └── settings.cpython-36.pyc
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── manage.py
└── newapp #アプリフォルダ(共通)
├── __init__.py
├── admin.py
├── apps.py
├── urls.py #新規作成
├── migrations
│ └── __init__.py
├── models #モデルフォルダ作って
│ └── __init__.py
│ └──reserve.py #それぞれモデルファイル作成
│ └──manage.py #こっちもモデルファイル
├── tests.py
└── views_reserve.py # views.pyファイルの名前を変更
└── views_manage.py # 新しくファイルを作成
newapp/urls.py 内のルーティングで2つのviewsファイルを指定。
urls.py
from django.urls import path
from . import views_reserve, views_manage #ファイル名指定
urlpatterns = [
path('reserve', views_reserve.xxx, name='reserve'),
path('manage', views_manage.xxx, name='manage'),
modelsフォルダ内のinit.py に下記の記載をします。
init.py
from newapp.models.reserve import *
from newapp.models.manage import *
これでいくつでもファイル分けられます。
(View側もフォルダつくってわけられますが階層が下がっちゃうので今回のケースではNG)
おわりに
わかってみれば簡単なんですが数日悩んだので誰かの役にたてれば幸いです。
2018/10/22 追記
コメント頂きまして、INSTALLED_APPS に追記でもいけるようです。
INSTALLED_APPSを
INSTALLED_APPS = [
... < 略 > ...
'reserve.apps.ReserveConfig',
'manage.apps.ManageConfig',
... < 略 > ...
]
としてあげれば、
from reserve.models import *
from manage.models import *
でお互い相互にモデルのクラスを持ってくることはできるはずです。
リレーションも、
hogehoge = models.ForeignKey('reserve.FOO', on_delete=models.CASCADE)
とかでいけます。(ベストプラクティスかどうかはさておき)