差分
このページの2つのバージョン間の差分を表示します。
| 次のリビジョン | 前のリビジョン | ||
| python:django:model_definition [2020/12/25 00:33] – 作成 ともやん | python:django:model_definition [2020/12/25 06:40] (現在) – [models.py を 1 クラス 1 ファイルに分割する] ともやん | ||
|---|---|---|---|
| 行 1: | 行 1: | ||
| ====== アプリのモデル定義 (django_app/ | ====== アプリのモデル定義 (django_app/ | ||
| + | Django アプリのモデル定義ファイルは、**manage.py startapp** で自動生成された状態では単一の Python モジュールファイルになっている。しかし、ほとんどのプロジェクトではそれなりの規模になると思われるので、モデルクラス 1 つにつき 1 Python ファイルに分けた方が保守性が良いと思う。\\ | ||
| + | <WRAP prewrap 100% #mintbl> | ||
| + | ^django_project ディレクトリ^^^^^ | ||
| + | | + ^django_app ディレクトリ^^^^ | ||
| + | |%%|%%| + |%%__init__%%.py | ||
| + | |%%|%%| + |admin.py | ||
| + | |%%|%%| + |apps.py | ||
| + | |%%|%%| + |models.py | ||
| + | |%%|%%| + |tests.py | ||
| + | |%%|%%| + |views.py | ||
| + | |%%|%%| + ^migrations ディレクトリ^^^ | ||
| + | |%%|%%|%%|%%| + |%%__init__%%.py | ||
| + | </ | ||
| + | |||
| + | ===== models.py を 1 クラス 1 ファイルに分割する ===== | ||
| + | 標準の models.py は以下のような内容である。\\ | ||
| + | <WRAP prewrap 100% # | ||
| + | <code python models.py> | ||
| + | from django.db import models | ||
| + | |||
| + | # Create your models here. | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | Python はディレクトリに **%%__init__%%.py** (内容は空でもよい) を置くと、ディレクトリ全体をパッケージと見なすようになる。このことを利用して **models.py** を削除して **models** ディレクトリとその中に **%%__init__%%.py** を置くようする。\\ | ||
| + | <WRAP prewrap 100% #mintbl> | ||
| + | ^django_project ディレクトリ^^^^^^ | ||
| + | | + ^django_app ディレクトリ^^^^^ | ||
| + | |%%|%%| + |%%__init__%%.py | ||
| + | |%%|%%| + |admin.py | ||
| + | |%%|%%| + |apps.py | ||
| + | |%%|%%| + ^models ディレクトリ | ||
| + | |%%|%%|%%|%%| + |%%__init__%%.py | ||
| + | </ | ||
| + | |||
| + | そして、例えば **media.py** で **Media** モデルを定義する。\\ | ||
| + | <WRAP prewrap 100% #mintbl> | ||
| + | ^django_project ディレクトリ^^^^^^ | ||
| + | | + ^django_app ディレクトリ^^^^^ | ||
| + | |%%|%%| + ^models ディレクトリ | ||
| + | |%%|%%|%%|%%| + |%%__init__%%.py | ||
| + | |%%|%%|%%|%%| + |media.py | ||
| + | </ | ||
| + | |||
| + | Python のパッケージ内参照 (**from . import name**) を利用して記述すると良い。\\ | ||
| + | [[https:// | ||
| + | <WRAP prewrap 100% # | ||
| + | <code python django_app/ | ||
| + | # -*- encoding: utf-8 -*- | ||
| + | from .media import Media | ||
| + | </ | ||
| + | </ | ||
| + | **.media** と記述することで **models** パッケージ内の **media** モジュール (media.py) から **import** するように Python に指示できる。\\ | ||
| + | |||
| + | <WRAP prewrap 100% # | ||
| + | <code python django_app/ | ||
| + | # -*- encoding: utf-8 -*- | ||
| + | from django.db import models | ||
| + | from django.utils.translation import ugettext_lazy as _ | ||
| + | |||
| + | class Media(models.Model): | ||
| + | media_hash = models.CharField(_(' | ||
| + | title = models.CharField(_(' | ||
| + | artist | ||
| + | album = models.CharField(_(' | ||
| + | year = models.CharField(_(' | ||
| + | track = models.IntegerField(_(' | ||
| + | genre = models.IntegerField(_(' | ||
| + | file_path | ||
| + | file_size | ||
| + | time_stamp = models.DateTimeField(_(' | ||
| + | youtube_id = models.CharField(_(' | ||
| + | # メタ情報 | ||
| + | class Meta: | ||
| + | app_label = ' | ||
| + | verbose_name = _(' | ||
| + | verbose_name_plural = _(' | ||
| + | db_table = ' | ||
| + | ordering = (' | ||
| + | unique_together = ((' | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ===== トラブルシューティング ===== | ||
| + | |||
| + | ==== モデル定義が No module named ' | ||
| + | <WRAP prewrap 100% #result> | ||
| + | < | ||
| + | $ python manage.py | ||
| + | Traceback (most recent call last): | ||
| + | File " | ||
| + | main() | ||
| + | File " | ||
| + | execute_from_command_line(sys.argv) | ||
| + | File "/ | ||
| + | utility.execute() | ||
| + | File "/ | ||
| + | django.setup() | ||
| + | File "/ | ||
| + | apps.populate(settings.INSTALLED_APPS) | ||
| + | File "/ | ||
| + | app_config.import_models() | ||
| + | File "/ | ||
| + | self.models_module = import_module(models_module_name) | ||
| + | File "/ | ||
| + | return _bootstrap._gcd_import(name[level: | ||
| + | File "< | ||
| + | File "< | ||
| + | File "< | ||
| + | File "< | ||
| + | File "< | ||
| + | File "< | ||
| + | File "/ | ||
| + | from media import Media | ||
| + | ModuleNotFoundError: | ||
| + | </ | ||
| + | </ | ||
| + | Django アプリのモデル定義パッケージの **%%__init__%%.py** を以下のように記述してはいけない。\\ | ||
| + | <WRAP prewrap 100% # | ||
| + | <code python django_app/ | ||
| + | # -*- encoding: utf-8 -*- | ||
| + | from media import Media | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | Python のパッケージ内参照 (**from . import name**) を利用して、パッケージ内の **media** モジュールから **import** するように記述する。\\ | ||
| + | <WRAP prewrap 100% # | ||
| + | <code python django_app/ | ||
| + | # -*- encoding: utf-8 -*- | ||
| + | from .media import Media | ||
| + | </ | ||
| + | </ | ||