【Django】Build web apps　～3章：Modelsとデータベース～

## Models
- データベースを作成するため
- このにclassを作成します

### modelを作成します
```ruby:food/modes.py
from django.db import models

# Create your models here.
## has return
class Item(models.Model):
    def __str__(self):
        return self.item_name
    item_name = models.CharField(max_length=200)
    item_desc = models.CharField(max_length=200)
    item_price = models.IntegerField()

## hasn't return
class Person(models.Model):
    person_name = models.CharField(max_length=100)
    person_sex = models.CharField(max_length=10)
```
## Migrations
models.py内のクラス定義
アプリケーションで使うデータベースの定義を自動的に作成、管理する機能です。
### デフォルトアプリケーション

```ruby:mysite/settings.py
# Application definition
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]
```
マイグレーションを実現
`python manage.py migrate`
### ユーザー定義アプリケーション
マイグレーション新規作成
1. settings.pyファイルにApplication definitionのところにアプリケーション定義します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/38c47159-2816-0aea-5a8e-8b0b61690646.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/b529dabe-6f23-5bc1-dff6-886611ec3f05.png)
2. モデルクラス作成します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/c90ed03e-c822-3e70-d2df-8c10d4a22af8.png)
3. アプリのマイグレーションを作成します
`python manage.py makemigrations [app_name]`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/4bec9fe2-fd71-6de4-7040-47f68ebaa1b3.png)
実行終了すると**マイグレーションID**が作成されます、今回の実行は「**0001**」です
「food/migrations」に「0001_initial.py」作成されたのを確認できます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/fdf18d14-f4fc-c891-c7c9-f9207a74d97b.png)
4. モデルのテーブルを作成します
`python manage.py sqlmigrate [app-name] [migrations-id]`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/3c08ae90-0f20-e60a-a36f-7d560d30e83d.png)
作成されるテーブル名は[app_name]_[mode_name]にからなり
5. マイグレーションを再実現します
`python manage.py migrate`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/dc8476c7-68a6-5d43-04dc-b6126171da1e.png)

## インターラクティブShellを利用します
起動するコマンドです
`python manage.py shell`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/60f67b50-c324-b399-b876-97f1666de0fc.png)

```ruby:same
>>> from food.models import Item, Person
>>> a = Item(item_name="Apple", item_desc="ringo", item_price=10)
>>> b = Person(person_name="Lan Huong", person_sex="female")
>>> Item
<class 'food.models.Item'>
>>> Person
<class 'food.models.Person'>
>>> Item.objects.all()
<QuerySet []>
>>> Person.objects.all()
<QuerySet []>
>>> a.save()
>>> Item.objects.all()
<QuerySet [<Item: Apple>]>
>>> b.save()
>>> Person.objects.all()
<QuerySet [<Person: Person object (1)>]>
>>>
```
Note: Personモデルクラスはリターンしてないのでオブジェクトを取得結果はオブジェクト数量のみ表示されます
退出する場合、`exit()`を実行します
いつかに「Shellでデータベースを操作する記事」を作成するわね＾O^
## Adminページを管理します
### Admin accountを作成します
Adminページ接続できるためにAdmin accountを作成するのが必要です、次のコマンドを実行します
`python manage.py createsuperuser`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/dbf4201f-8b41-beab-c778-e72d26d92e78.png)

```ruby:例として
Username (leave blank to use '912767'): lehuong
Email address: lehuong@gmail.com
Password: lehuong
```
作成したアカウントを使って登録しますしょ～
あ～ まずは、*runserver*コマンドの実行を忘れないようね！文章忘れたら :point_right:[コマンド一覧をご参考、どうぞ](https://qiita.com/huong/items/cfcb338db55957925e39)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/7bc21156-6238-5749-efbb-2719dfcbf13b.png)
登録できました、Adminページからユーザー、管理グループなど作成できます。触ってみてね

### Adminページに対象オブジェクトモデルを管理します
で、以前に作成したItemオブジェクトモデルはどこ？
Itemオブジェクトが表示される為*admin.py*ファイルにオブジェクト情報を追加しないとね
Point：**[app-name]/admin.py**に`admin.site.register([model-name])`書き込みます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/26654953-b598-5d42-c084-63938e2d7236.png)
:bird: 出た！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/205d4284-687d-e672-4acc-13d1b4af392b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/d6fb89ba-a72b-207a-ffd9-15691bbab19b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/c4a11a81-31de-7436-4180-9e6645fc03ae.png)

## データベースからデータを取り出します
データ取得方法は、
Model(Item) - Manager(objects) - Method(all) ⇒ Item.objects.all()
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/67f37d6e-f9aa-df01-eaf3-0524edacafda.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/d607a912-7aa8-c7e5-6407-fe6de79787d6.png)

## 更にデータベースをUPDATEします
作成した後プロジェクトを追加したい場合はどうすればいいのかでしょか
**food_item**テーブルは**item_image**カラムを追加するような例としてやってみます
### models更新
```ruby:food/models.py
class Item(models.Model):
    def __str__(self):
        return self.item_name
    item_name = models.CharField(max_length=200)
    item_desc = models.CharField(max_length=200)
    item_price = models.IntegerField()
    item_image = models.CharField(max_length=500,
default="https://cdn.dribbble.com/users/1963449/screenshots/5915645/404_not_found.png")

```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/5da03271-6cb6-e396-ed07-8a4c4bbaae9e.png)
###migrations作成
`python manage.py make makemigrations [app-name]`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/9c7d59e6-bc65-3d67-c916-761c22ad8b89.png)

### SQL更新
`pythn manage.py sqlmigrate [app-name] [migrations-id]`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/7842aa68-3f38-2e68-ec19-8131efd8b546.png)

### マイグレーション再実現
`python manage.py migrate`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/07728db8-3423-e628-6468-3dcd138c2c75.png)

結果を確認しましょ～
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/5984d9bb-3e78-4370-4fb1-2db51a0f63c2.png)


## よく出来ましたね
ちょっとでもモデルとデータベースの関連が分かりましたか
では、
**操作するコマンドを集めますしょ**
`python manage.py make makemigrations [app-name]`
:point_up:反映する時、[django-project]/settings.pyの固定変数INSTALLED_APPSに[app-name]が設定されるし、[app-name]/models.pyに新しいモデルクラスが追加されるのが必要です
`pythn manage.py sqlmigrate [app-name] [migrations-id]`
:v:作成した後にマイグレーション再実現しないと更新した情報は反映されません
`python manage.py migrate`
`python manage.py shell`
`python manage.py createsuperuser`

**関連記事**
[・【Django】Build web apps　～2章：ViewsとURL Patterns～](https://qiita.com/huong/items/22ef5de404a6f823602b)
[・【Django】Build web apps　～4章：Templates～](https://qiita.com/huong/items/9658853fbfc891ddb69c)
[・【Django】Build web apps　～使ったコマンド～](https://qiita.com/huong/items/cfcb338db55957925e39)