Django で csv のデータを登録する

次のページを参考にしました。
[Django でアプリケーションを作ってみる](http://bty.sakura.ne.jp/wp/archives/1071)
[PythonスクリプトでDjangoにデータを登録する](http://bty.sakura.ne.jp/wp/archives/1088)

MariaDB が使える状態になった　プロジェクトに機能を加えます。

プロジェクトの作り方はこちら
[Django で Hello World](https://qiita.com/ekzemplaro/items/ef63edfa93caaab4071e)

sqlite3 から MariaDB への切り替え方はこちら
[Django で MariaDB を使う](https://qiita.com/ekzemplaro/items/b0140f16a780c689b890)

プロジェクト名は、proj01

MariaDB に
user: django
password: tiger123
データベース: django_apart
が作成され、proj01/settings.py の修正も済んでいるものとします。

>```text
MariaDB [(none)]> create database django_apart;
MariaDB [(none)]> grant all on django_apart.* to django@localhost;
```

1) アプリケーション apartment を作成します。

```bash
python manage.py startapp apartment
```

2) proj01/settings の編集

```py:proj01/settings.py
（省略）
INSTALLED_APPS = [
    'apartment',
    'home',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]
（省略）
```

3) apartment/models.py の編集

```py:apartment/models.py
from django.db import models

class Heya(models.Model):
    bango = models.CharField(max_length=20)
    tanako = models.CharField(max_length=50)
    hirosa = models.CharField(max_length=20)
    yachin = models.IntegerField()
    def __unicode__(self):
        return self.bango
```

4) データベースへの反映

```bash
python manage.py makemigrations
python manage.py migrate
```

5) CSV ファイルの作成

```bash
mkdir static
mkdir static/apartment
```

```csv:static/apartment/authors.csv
芥川龍之介,101,2DK,35000
江戸川 乱歩,102,2DK,35000
岡本 綺堂,103,1DK,30000
小川 未明,201,2DK,36000
梶井 基次郎,202,2DK,36000
菊池 寛,203,1DK,31000
国木田 独歩,301,2DK,40000
佐藤春夫,302,2DK,40000
太宰 治,303,1DK,37000
```

6) スクリプトの作成

```bash
mkdir apartment/management
mkdir apartment/management/commands
```

```py:apartment/management/commands/what_time_is_it.py
# ------------------------------------------------------------------
#
#	what_time_is_it.py
#
#					Dec/18/2018
# ------------------------------------------------------------------
from django.core.management.base import BaseCommand
from django.utils import timezone
import sys 

class Command(BaseCommand):
	help = 'Displays current time'

	def handle(self, *args, **kwargs):
		sys.stderr.write("*** start ***\n")
		time = timezone.localtime(timezone.now()).strftime('%X')
		self.stdout.write("It's now %s" % time)
		sys.stderr.write("*** end ***\n")
#
# ------------------------------------------------------------------
```

```py:apartment/management/commands/list_rooms.py
# ------------------------------------------------------------------
#
#	list_rooms.py
#
#					Dec/18/2018
#
# ------------------------------------------------------------------
from django.core.management.base import BaseCommand
from apartment.models import Heya
import sys

class Command(BaseCommand):
	help = 'Displays current time'

	def handle(self, *args, **kwargs):
		sys.stderr.write("*** start ***\n")
#
		for h in Heya.objects.all():
			print(h.tanako,"\t", end="")
			print(h.bango,"\t", end="")
			print(h.hirosa,"\t", end="")
			print(h.yachin)
#
		sys.stderr.write("*** end ***\n")
# ------------------------------------------------------------------
```

```py:apartment/management/commands/register_rooms.py
# ------------------------------------------------------------------
#
#	register_rooms.py
#
#					Dec/18/2018
#
# ------------------------------------------------------------------
from django.core.management.base import BaseCommand
from apartment.models import Heya
import csv
import sys

file_csv = "static/apartment/authors.csv"

class Command(BaseCommand):
	help = 'Displays current time'

	def handle(self, *args, **kwargs):
#
		sys.stderr.write("*** start ***\n")
		fp = open(file_csv, 'r')
		reader = csv.reader(fp)
		for rr in reader:
			print(rr)
			hh = Heya()
			hh.tanako = rr[0]
			hh.bango = rr[1]
			hh.hirosa = rr[2]
			hh.yachin = rr[3]
			hh.save()
#
		sys.stderr.write("*** end ***\n")
		fp.close()
# ------------------------------------------------------------------
```

7) スクリプトが使えることを確認

```text
$ python manage.py help

Type 'manage.py help <subcommand>' for help on a specific subcommand.

Available subcommands:

[apartment]
    list_rooms
    register_rooms
    what_time_is_it
（省略）
```

8) スクリプトの実行

今の時間を表示してみます。

```text
$ python manage.py what_time_is_it
*** start ***
It's now 09:10:59
*** end ***
```

データの状態を確認

```text
$ python manage.py list_rooms
*** start ***
*** end ***
```

データを登録

```text
$ python manage.py register_rooms
*** start ***
['芥川龍之介', '101', '2DK', '35000']
['江戸川 乱歩', '102', '2DK', '35000']
['岡本 綺堂', '103', '1DK', '30000']
['小川 未明', '201', '2DK', '36000']
['梶井 基次郎', '202', '2DK', '36000']
['菊池 寛', '203', '1DK', '31000']
['国木田 独歩', '301', '2DK', '40000']
['佐藤春夫', '302', '2DK', '40000']
['太宰 治', '303', '1DK', '37000']
*** end ***
```

データの状態を確認

```text
$ python manage.py list_rooms
*** start ***
芥川龍之介 	101 	2DK 	35000
江戸川 乱歩 	102 	2DK 	35000
岡本 綺堂 	103 	1DK 	30000
小川 未明 	201 	2DK 	36000
梶井 基次郎 	202 	2DK 	36000
菊池 寛 	203 	1DK 	31000
国木田 独歩 	301 	2DK 	40000
佐藤春夫 	302 	2DK 	40000
太宰 治 	303 	1DK 	37000
*** end ***
```

9) 管理ルールでデータを確認するには

9-1) スーパーユーザーを作成

```bash
python manage.py createsuperuser
```

9-2) apartment/admin.py を編集

```py:apartment/admin.py
from django.contrib import admin

from apartment.models import Heya
 
admin.site.register(Heya)
```

9-3) 開発サーバーを起動

```bash
python manage.py runserver
```

9-4) 管理画面にアクセス
>http://127.0.0.1:8000/admin

![heyas01.png](https://qiita-image-store.s3.amazonaws.com/0/179446/5d0c9840-a49d-0ae0-591d-2d5b30242e94.png)

![heyas02.png](https://qiita-image-store.s3.amazonaws.com/0/179446/6eedddc3-2a06-ea06-55c2-23594a7c9336.png)