Djangoアプリの作成


## アプリをgeneratorで作成する

```
$ python3 manage.py startapp sampleapp
```

コミットするとこんな感じ

```sh
$ 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
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にテーブル定義が入りました:tada: 

```
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`がデフォルトのようです。（好き。）