Django

【Django】Webアプリのフォルダ構成のアイデア〜違うアプリで同じテーブルを使いたい!

とある業界の予約システムをつくることになりまして、

ログイン周りとライブラリの優秀さから、

Pythonの『Django(ジャンゴ)』を選び、開発を進めている中で、数日間悩んだ事がありました。

それは、

アオキ
違うアプリで同じテーブルは使えないの?

という事。

例えばインターネットで映画の予約をしようとすると、

  • 一般の方が見る予約用サイト(アプリ)
  • 関係者が登録したりする管理サイト(アプリ)

大きく2つのアプリ(ページ)が必要になります。

URLで例えると、

http://とある映画館.com/reserve #予約側

http://とある映画館.com/manage #管理側

とURLが2つあるような状態です。

『Django』の仕組みとしては、

アプリ毎にそれぞれ独立して動かす事を推奨している
ので、

例えば

管理側から予約側の登録データを見るということはできない

ことになっています。

アオキ
とはいっても管理側からもデータみたいわけよ。

ということで、構成を考えてみました。

環境: Django 2.1

Sponsored link

Django 違うアプリで同じテーブルを使えない・・?

『Django(ジャンゴ)』でアプリをつくる際、

一般的にはこんなコマンドをうってフォルダやファイルを作成することになります。

まずはお約束のこちら。

mkdir django_project #インストール用フォルダをつくる
cd django_project #フォルダに入る
python -m venv venv #venvというツールを使って仮想環境をつくる
source venv/bin/activate #仮想環境を有効にする
> (venv)

もしジャンゴがインストールされてなかったらインストール。

pip install django #ジャンゴインストール

プロジェクト作成。

プロジェクトといっても最初は共通の設定フォルダが作成されるので、
名前はconfig としておいた方がよさげです。

最後のピリオドをつけることで、このフォルダ内に作成するよと明示することになります。

django-admin startproject config . #プロジェクト作成 configで作る事を推奨

この時点のフォルダ構成はこうなります。

(venv) django_project$ tree
.
├── config
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── manage.py

この次に、アプリ用のフォルダを作成することになります。

予約用のアプリをつくるなら

python manage.py startapp reserve

とすると新たに reserveフォルダが作成されて、

python manage.py startapp manage

とすると、新たにmanageフォルダが作成されます。

フォルダの中にviews.pyやらmodels.pyやら、MTVの構成が作成されます。

MTV構成の参照記事。

ただ、こうやって作っちゃうと、

管理側から予約側の登録データを見るということはできない

という事になっちゃいます。

Djangoというかpythonの仕様らしく、

importできるのは、同じ階層か下の階層

という決まりがあるようで、

試しに import ..models from *** なんてやってもうまく動かず。

ググりまくってようやく一つの解決策ができました。

Sponsored link

Django 違うアプリで同じテーブルを使う場合のフォルダ構成

importできるのは、同じ階層か下の階層

というのがヒント。

結論からいうと、

アオキ
views.pyをいくつかつくってmodelも同じ階層に置けばOK

という事になります。

具体的は、共通のアプリを1つ作ります。

python manage.py startapp newapp

(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
├── migrations
│   └── __init__.py
├── models.py
├── tests.py
└── views.py

共通アプリ用のnewappフォルダの中に、

予約用のreserveフォルダと管理用のmanageフォルダをつくりますが、

importできるのは同じ階層か下の階層

という決まりがあるので、views.pyを同じ階層で分ける必要があります。

例えば

└── newapp
├── __init__.py
├── admin.py
├── apps.py
├── migrations
│   └── __init__.py
├── models.py
├── tests.py
└── views_reserve.py # views.pyファイルの名前変更
└── views_manage.py # 新しくファイル作成

とします。

URLをコントロールするurls.pyファイルを書き換えますが、

urls.pyは、

  • configフォルダの中のurls.py
  • newappの中のurls.py

と2つ必要になるので要注意です。

MTV構成の参照記事。


config/urls.py から newapp/urls.py につなげるようなイメージです。

次に、newapp/urls.pyから それぞれのviewファイルにつなげます。

xxxのところはview内の関数かクラス名を書きます。

予約情報などをデータベースとつなぐmodelsは、
フォルダをつくって分けることもできるので、

models.pyを削除してmodelフォルダを作り、
その中でファイルを分けることもできます。

├── models.py ##これは削除
├── model
│   └── __init__.py
│   └──reserve.py
│   └──manage.py

とすることもできます。

model/init.py (initの前後にアンダーバー2つずつ) ファイル内で、

from reserve import *
from manage import *

とすれば2つのモデル用ファイルを読み込むことができます。

おわりに

importできるのは同じ階層か下の階層

という仕様のおかげで数日間悩みましたが、

結果的にすっきりしたフォルダ構成になったような気がします。

『Django(ジャンゴ)』に限らずwebフレームワークはある程度決まりがあるので、

そのルールにのりつつ、カスタマイズできるところはカスタマイズして、

さくっと高品質なアプリがつくれるようになりたいものですね。

アオキ
もりもり開発するどー

2018/10/24 追記

Qiitaに投稿していたら、こんなコメントをいただけました。

アオキ
config.py内のINSTALLED_APPSに記載すればよかったんですね・・

その後 しばらくして、認証テーブルを2つにわけたいと思うようになり、
Djangoの仕様上、認証はアプリ毎に1つ推奨のようで、
コメントいただいた方法でフォルダ構成を作り変えたのでした。

関連記事

created by Rinker
¥3,240 (2019/03/20 09:40:21時点 Amazon調べ-詳細)

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

CAPTCHA


Sponsored link

関連記事

  1. flask

    【Python】Flaskのチュートリアルがもっとわかるようになるまとめ【初心者向け】

    『Python(パイソン)』をホームページやウェブサイトとして表示させ…

  2. Django

    【Django】【Laravel】【RubyOnRails】を比較してみた【初心者向け】【体験談】

    さらに開発力を高めるべく、先日とあるサロンに入会しまして、…

  3. Django

    【Python】でWebアプリをがっつりやるならDjango一択な4つの理由【初心者向け】

    最近とある業界の『web予約サービス』をつくろうということになりまして…

  4. Django

    【Python/Django】Webアプリのテンプレートなら『cookiecutter』がよさげ【簡…

    っとなったとしたら、Pythonの全部入りwebフレームワ…

  5. Django

    【Python/Django】webフレームワークを使う6つのコツ〜最短距離でアプリをつくるために【…

    とある業界のWeb予約システムをつくることになりまして、Pytho…

Sponsored link

最近の記事

アーカイブ

Sponsored link
  1. PHP

    【PHP】配列や連想配列が覚えづらかったので学校に例えてみた【初心者向け】
  2. Laravel

    【PHP】【図解】クラスと抽象クラスとインターフェースとトレイトとDIをまとめて…
  3. Vue.js

    Vue.js+Vue-router+BulmaでさくっとSPAをつくってみた【初…
  4. docker初心者向けdocker-composeからやったほうがいいかもよ

    Docker

    【Docker】初心者はdocker-composeから始めた方がいいかもしれな…
  5. Django

    【Django】【Laravel】【RubyOnRails】を比較してみた【初心…
PAGE TOP