差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン | ||
python:django:model_definition [2020/12/25 01:01] – ともやん | python:django:model_definition [2020/12/25 06:40] (現在) – [models.py を 1 クラス 1 ファイルに分割する] ともやん | ||
---|---|---|---|
行 4: | 行 4: | ||
^django_project ディレクトリ^^^^^ | ^django_project ディレクトリ^^^^^ | ||
| + ^django_app ディレクトリ^^^^ | | + ^django_app ディレクトリ^^^^ | ||
- | |%%|%%| + |%%__init__%%.py | + | |%%|%%| + |%%__init__%%.py |
|%%|%%| + |admin.py | |%%|%%| + |admin.py | ||
- | |%%|%%| + |apps.py | + | |%%|%%| + |apps.py |
|%%|%%| + |models.py | |%%|%%| + |models.py | ||
|%%|%%| + |tests.py | |%%|%%| + |tests.py | ||
|%%|%%| + |views.py | |%%|%%| + |views.py | ||
- | |%%|%%| + ^migrations | + | |%%|%%| + ^migrations |
- | |%%|%%|%%|%%| + |%%__init__%%.py | + | |%%|%%|%%|%%| + |%%__init__%%.py |
</ | </ | ||
- | ===== models.py を 1 クラス 1 ファイルに分割 ===== | + | ===== models.py を 1 クラス 1 ファイルに分割する |
標準の models.py は以下のような内容である。\\ | 標準の models.py は以下のような内容である。\\ | ||
<WRAP prewrap 100% # | <WRAP prewrap 100% # | ||
行 24: | 行 24: | ||
</ | </ | ||
- | Python はディレクトリに **__init__.py** (内容は空でもよい) を置くと、ディレクトリ全体をパッケージと見なすようになる。このことを利用して **models.py** を削除して **models** ディレクトリとその中に **__init__.py** を置くようする。\\ | + | Python はディレクトリに **%%__init__%%.py** (内容は空でもよい) を置くと、ディレクトリ全体をパッケージと見なすようになる。このことを利用して **models.py** を削除して **models** ディレクトリとその中に **%%__init__%%.py** を置くようする。\\ |
<WRAP prewrap 100% #mintbl> | <WRAP prewrap 100% #mintbl> | ||
^django_project ディレクトリ^^^^^^ | ^django_project ディレクトリ^^^^^^ | ||
| + ^django_app ディレクトリ^^^^^ | | + ^django_app ディレクトリ^^^^^ | ||
- | |%%|%%| + |%%__init__%%.py | + | |%%|%%| + |%%__init__%%.py |
|%%|%%| + |admin.py | |%%|%%| + |admin.py | ||
|%%|%%| + |apps.py | |%%|%%| + |apps.py | ||
- | |%%|%%| + |models ディレクトリ|||Django アプリのモデル定義ファイル。 | | + | |%%|%%| + ^models ディレクトリ |
- | |%%|%%|%%|%%| + |%%__init__%%.py | + | |%%|%%|%%|%%| + |%%__init__%%.py |
+ | </ | ||
+ | |||
+ | そして、例えば **media.py** で **Media** モデルを定義する。\\ | ||
+ | <WRAP prewrap 100% # | ||
+ | ^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% # | ||
+ | < | ||
+ | $ 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 | ||
+ | </ | ||
</ | </ | ||