Django
で Web
アプリケーションの開発をしているとモデル部分を実装する「 models.py
」というファイルのコード量が多くなることがあります。テーブル数とフィールド数に依存してコード量が増えるので、アプリケーションの規模が大きくなるとファイルのコード量は自然と増えていきます。コード量が増えすぎると可読性が低下するという問題もあるので、今回はこの「 models.py
」というファイルの分割方法を説明していきたいと思います。
コーディング規約などで1ファイルあたりのコード量に規制がある場合にも活用できると思います。
前提条件
- Python : 3.9.1
- Django : 3.1.4
通常の models.py
通常「 models.py
」はこのように配置されています。
app/
__init__.py
models.py
models.py
には下記の class
が実装されているものとします。
from django.db import models
class Sample(models.Model):
value = models.CharField(max_length=20, default=0, blank=True)
class Test(models.Model):
value = models.CharField(max_length=20, default=0, blank=True)
この「 models.py
」を分割したいんですが、
app/
__init__.py
models_sample.py
models_test.py
このように分割しても正しくモデルと認識されません。
models.py を分割する
「 models.py
」を分割するにはまず、「 models
ディレクトリ」を作成する必要があり、作成した models
ディレクトリに「 __init__.py
」と分割した「 models.py
」を作成します。
app/
__init__.py
models/
__init__.py
sample.py
test.py
「 sample.py
」と「 test.py
」は下記の通り。
sample.py
from django.db import models
class Sample(models.Model):
value = models.CharField(max_length=20, default=0, blank=True)
test.py
from django.db import models
class Test(models.Model):
value = models.CharField(max_length=20, default=0, blank=True)
ただ、これだけだと「 manage.py
」の「 makemigraitons
コマンド」や「 migrate
コマンド」でモデルが認識されません。
そこで、「 __init__.py
」と「モデルの class
」に手を加えます。
__init__.py
from app.models.sample import Sample
from app.models.test import Test
モデルクラスの「 Sample
クラス」と「 Test
クラス」をインポートします。
sample.py
from django.db import models
class Sample(models.Model):
value = models.CharField(max_length=20, default=0, blank=True)
class Meta:
app_label = 'app'
test.py
from django.db import models
class Test(models.Model):
value = models.CharField(max_length=20, default=0, blank=True)
class Meta:
app_label = 'app'
Django
の Meta
オプションの「 app_label
」にアプリケーション名を設定します。アプリケーション名と「 app_label
」を一致させることで「 manage.py
」の「 makemigraitons
コマンド」や「 migrate
コマンド」で分割したモデルを認識させることができるようになります。
実装方法まとめ
実装方法を簡単にまとめておきます。
- models ディレクトリを作成する
- 作成した models ディレクトリに __init__.py と分割後のモデルのファイルを配置する
- モデルクラスを __init__.py で import する
- モデルクラスの Meta オプションの app_label にアプリケーション名を設定する
最後に
今回は普通に開発しているとあまり実装することはない models.py
の分割方法について説明しました。モデルの実装量が多く、コードの可読性が低く感じているのであれば、今回の models.py
の分割方法を試してみてもらえればと思います。
models.py
の分割以外にも views.py
や Django REST framework
で使用する serializers.py
も分割することができるのでまた別の機会に説明したいと思います。
コメント