LoginSignup
21
20

More than 5 years have passed since last update.

【Django】複数アプリで共通のテーブルを使いたいケース

Last updated at Posted at 2018-10-21

とある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)

とかでいけます。(ベストプラクティスかどうかはさておき)

21
20
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
20