アプリをgeneratorで作成する
$ python3 manage.py startapp sampleapp
コミットするとこんな感じ
$ git commit
[master 02968a1] create new app named `sampleapp`
7 files changed, 17 insertions(+)
create mode 100644 sampleapp/__init__.py
create mode 100644 sampleapp/admin.py
create mode 100644 sampleapp/apps.py
create mode 100644 sampleapp/migrations/__init__.py
create mode 100644 sampleapp/models.py
create mode 100644 sampleapp/tests.py
create mode 100644 sampleapp/views.py
settings.py
に作成したアプリを登録しておく。
diff --git a/mysite/settings.py b/mysite/settings.py
index d78d9be..e2b99d3 100644
--- a/mysite/settings.py
+++ b/mysite/settings.py
@@ -37,6 +37,7 @@ INSTALLED_APPS = [
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
+ 'sampleapp',
]
Model作成
サッカーチームを登録するEntityでもつくってみる。
mysite/sampleapp/models.py
from django.db import models
from django.utils import timezone
class ClubTeam(models.Model):
author = models.ForeignKey('auth.User')
name = models.CharField(max_length=100)
created_date = models.DateTimeField(default=timezone.now)
def __str__(self):
return self.name
__str__
は特殊なメソッド。Object::toString()
みたいな感じで、printにObjectを渡したときも呼ばれるとのこと。とりあえずname
プロパティを返却するようにしてみた。
DBに定義を渡す
マイグレーション生成
モデル定義をmodels.pyに書いたので、マイグレーションを生成する。
$ py3 manage.py makemigrations sampleapp
Migrations for 'sampleapp':
sampleapp/migrations/0001_initial.py
- Create model ClubTeam
この時点ではマイグレーションのpythonコードを生成しただけなので、DBには変化なし。
MariaDB [mysite_db]> show tables;
+----------------------------+
| Tables_in_mysite_db |
+----------------------------+
| auth_group |
| auth_group_permissions |
| auth_permission |
| auth_user |
| auth_user_groups |
| auth_user_user_permissions |
| django_admin_log |
| django_content_type |
| django_migrations |
| django_session |
+----------------------------+
10 rows in set (0.00 sec)
マイグレーション実行
アプリ全体を指定してmigrate
する。ファイル単位での指定もできる模様。
$ python3 manage.py migrate sampleapp
Operations to perform:
Apply all migrations: sampleapp
Running migrations:
Applying sampleapp.0001_initial... OK
DBにテーブル定義が入りました
MariaDB [mysite_db]> show tables;
+----------------------------+
| Tables_in_mysite_db |
+----------------------------+
| auth_group |
| auth_group_permissions |
| auth_permission |
| auth_user |
| auth_user_groups |
| auth_user_user_permissions |
| django_admin_log |
| django_content_type |
| django_migrations |
| django_session |
| sampleapp_clubteam |
+----------------------------+
11 rows in set (0.00 sec)
余談
modelにFKを指定( author = models.ForeignKey('auth.User')
)しているので、そこがどうなっているかをmigrationで見てみる。
ついでに主キーも。
0001_initial.py
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=100)),
('created_date', models.DateTimeField(default=django.utils.timezone.now)),
('author', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
- PKは
id
という名前で自動生成されてました。(よい。) - FKは
onDelete=CASCADE
がデフォルトのようです。(好き。)