初心者がDjangoのチュートリアルで何をやり何を考えているのか(2)-2


## 目的
これからプログラミングを学ぼうとする初心者が何をやり何を考えているか記録する備忘録。プラス記事を書くことで最後までやり通すためのモチベーション維持。どこか間違えてたり、アホなことしてたりしたら、アドバイス等いただけると幸いです。

## 環境
* ThinkPad T440p
* Ubuntu Linux 18.04 日本語 Remix
* Python 3.6.7
* pip 9.0.1
* Django 2.1.3

## 参考サイト(先人たちに感謝を）
* [Writing your first Django app, part 2](https://docs.djangoproject.com/en/2.1/intro/tutorial02/)
* [はじめての Django アプリ作成、その2](https://docs.djangoproject.com/ja/2.0/intro/tutorial02/)
* [Python Django チュートリアル(1)](https://qiita.com/maisuto/items/eece9d880d94fd241a0d)

* <a href="http://farewell-work.hatenablog.com/entry/2017/05/07/160329">Django入門その後に(1)〜始めに〜 - プログレッシブ・プロレタリアート</a>
* <a href="http://farewell-work.hatenablog.com/entry/2017/05/07/160359">Django入門その後に(2)〜プロジェクトとアプリケーションを作ろう〜 - プログレッシブ・プロレタリアート</a>
* <a href="http://farewell-work.hatenablog.com/entry/2017/05/07/160503">Django入門その後に(3)〜MTVモデルって何ですか？　難しいですか？　教えてもらって良いですか？〜 - プログレッシブ・プロレタリアート</a>
* <a href="http://farewell-work.hatenablog.com/entry/2017/05/07/160606">Django入門その後に(4)〜繋がるDB〜 - プログレッシブ・プロレタリアート</a>
* <a href="http://farewell-work.hatenablog.com/entry/2017/05/07/160708">Django入門その後に(5)〜モデルを作ろう〜 - プログレッシブ・プロレタリアート</a>
* <a href="http://farewell-work.hatenablog.com/entry/2017/05/07/160813">Django入門その後に(6)〜migrateって何〜 - プログレッシブ・プロレタリアート</a>
* <a href="http://farewell-work.hatenablog.com/entry/2017/05/07/160824">Django入門その後に(7)〜Adminサイトを見てみよう〜 - プログレッシブ・プロレタリアート</a>
* <a href="http://farewell-work.hatenablog.com/entry/2017/05/07/160836">Django入門その後に(8)〜TとVを追加してとにかく動かす〜 - プログレッシブ・プロレタリアート</a>

## 初心者は悩んでいた・・・
Tutorialに言われるがままモデルをつくり有効化しAPIと戯れてみたが...わからん。ここをこうしろと言われて（それでもミスすることはあるが）書いてあるとおりに反応が帰ってきて、だからオレは何ができるようになったというの。

これはPythonの勉強が足らないからか、オブジェクト指向プログラミングがつかめてないからか、データーベースの知識が足りないからか、用語がわからないからか、どうすりゃいいの？とググっていたら素敵なサイトを発見した。

* <a href="http://farewell-work.hatenablog.com/entry/2017/05/07/160503">Django入門その後に(3)〜MTVモデルって何ですか？　難しいですか？　教えてもらって良いですか？〜 - プログレッシブ・プロレタリアート</a>
* <a href="http://farewell-work.hatenablog.com/entry/2017/05/07/160606">Django入門その後に(4)〜繋がるDB〜 - プログレッシブ・プロレタリアート</a>
* <a href="http://farewell-work.hatenablog.com/entry/2017/05/07/160813">Django入門その後に(6)〜migrateって何〜 - プログレッシブ・プロレタリアート</a>

欲しかった情報そのものが！！！あ、なんだ、modelってデーターベース（の一部）なんじゃん、migrateってデータをデータベースに入れることなのね、MTVモデルってこんな仕組みになってるのか、と超絶腑に落ちた。Tutorialにも書いてあることなのかもしれないけれど、全然ピンとこなかったんです。やたら詳しい定義とか書かれてあっても、うん、ん？？？うん、そう、で？？？。それより初心者にはこんな感じなんだよと多少乱暴でもイメージを伝えてくれる方がわかりやすい。最高です。damedeathさん、貴方によって迷える子羊が一匹救われました。

**初心者にはひと目でわかる全体像が必要である**

これで今自分がやっていることの意味がわかる。今自分がどこにいて、どこに行こうとしているのかわかる。ざっくりと全体像がわかることが初心者には大切だ。Tutorialでポチポチ入力するのは、暗い森のなかを親切に手を引かれて案内されてる感じ。ゴールまではたどり着くんだろう。でもその後は？放り出されて何をしていいかどこへ行けばいいのかわからない。地図（全体像）があったら、手探りでも確認しながら自分で歩いていける気がする。この感覚が欲しかった。

もう一度確認する

1. modelを作った（データを入れる入れ物をつくるって感じか）
    * pollsapp/models.py をいじってQuestionとChoiceをつくった

2. modelを有効にした
    * /pollsproject/setting.py にmodel作ったぜと教えてやる
    * `$ python manage.py makemigrations pollsapp` でこうやってデータ入れろという命令書(migrations)を作ってやる
    * `$ python manage.py migrate` するとデータベースにデータが入る

3. API で遊んでみた
    * `$ python manage.py shell` で python shell 起動、これでデータを色々いじくることができるよと

```
>>> from pollsapp.models import Choice, Question　#modelの中身インポートしな
>>> Question.objects.all()　#んでQuestionの中身見せてみろよ
<QuerySet []>　#何も入ってないです！
>>> from django.utils import timezone　#んじゃ時間の情報入れろよ
>>> q = Question(question_text="What's new?", pub_date=timezone.now())　#じゃquestion_textにはWhat's new?って入れて、pub_dateには現在時刻入れろ
>>> q.save()　#でそれを保存しろ
>>> q.id　#その情報のidは？
1 # 1番です！
>>> q.question_text　#question_textの中身は？
"What's new?"　#What's new?です！
>>> q.pub_date　#その情報入れた時刻は？
datetime.datetime(2018, 12, 6, 17, 32, 17, 192930, tzinfo=<UTC>)　#2018年12月6日です！
>>> q.question_text = "What's up?"　#じゃquestion_textにWhat's up?って入れ直せ
>>> q.save()　#でそいつを保存しろ
>>> q.question_text　#question_textの中身は？
"What's up?"　#What's up?です！
>>> Question.objects.all()　#今持ってるもの全部見せろ
<QuerySet [<Question: Question object (1)>]>　#○□△○◇♡...
```
* /pollsapp/models.pyを修正　さっきの答え方がなっとらんので正す

```
def __str__(self):
    return self.question_text　などなど付け加える
```
すると

```
>>> Question.objects.all() #今持ってるもの全部見せろ
<QuerySet [<Question: What's up?>]>　#What's up?です！
```

という風に答え方が変わる

```
>>> Question.objects.filter(id=1)　#id1番を出せ
<QuerySet [<Question: What's up?>]>　#What's up?です！
>>> Question.objects.filter(question_text__startswith='What')　#Whatから始まるデータを出せ
<QuerySet [<Question: What's up?>]>　#What's up?です！
>>> from django.utils import timezone
>>> current_year = timezone.now().year
>>> Question.objects.get(id=2)　#id2番の情報を出せ
Traceback (most recent call last):
    （中略）
pollsapp.models.Question.DoesNotExist: Question matching query does not exist.　#色々探したんですが見つかりませんでした！申し訳ありません！
>>> Question.objects.get(pk=1)　#じゃid1番の情報を出せ
<Question: What's up?>　#What's up?です！

>>> q = Question.objects.get(pk=1)　#主キー1番の情報を入れろ
>>> q.was_published_recently()　#最近仕入れた情報か？
True　#そうです！

>>> q.choice_set.all()　#qのchoiceに入ってるもの見せろ
<QuerySet []>　#ありません！
>>> q.choice_set.create(choice_text='Not much',votes=0)　#qのchoiceにNot muchを入れろ
<Choice: Not much>　#Not muchですね！
>>> q.choice_set.create(choice_text='The sky',votes=0)　#qのchoiceにThe skyを入れろ
<Choice: The sky>　#The skyですね！
>>> c = q.choice_set.create(choice_text='Just hacking again',votes=0)　#qのchoiceにJust hacking againといれてそれをcに入れろ
>>> c.question　#じゃcにつながってるquestionは？
<Question: What's up?>　#What's up?です!
>>> q.choice_set.all()　#qのchoiceに入ってるもの全部見せろ
<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>
>>> q.choice_set.count()　#全部でいくつある？
3　#3個です！
>>> Choice.objects.filter(question__pub_date__year=current_year)　#今年のものを出せ
<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>　#Not much,The sky,Justhacking againです！
>>> c = q.choice_set.filter(choice_text__startswith='Just hacking')　#Just hacking で始まる情報をcに入れろ
>>> c.delete()　#Cを消せ
(1, {'pollsapp.Choice': 1})　#該当1個ありました！消します！
>>> q.choice_set.all()　#qのchoiceを全部見せろ
<QuerySet [<Choice: Not much>, <Choice: The sky>]>　#Not muchとThe skyです！
```

なぜか軍隊風…長かった…よくよく考えたら全部訳す必要なかったんじゃ…

**初心者は無駄に無駄を重ねる生き物である**

## Adminサイトに入る
疲れたので駆け足で。`$ python manage.py createsuperuser`で管理者の名前とメールアドレスとパスワードを設定。その後サーバーを起動、`http://127.0.0.1:8000/admin`にアクセスすると管理画面へ!!

作ったpollsappアプリをadmin画面で編集できるようにするためにpollsapp/admin.py を編集する

```
from django.contrib import admin

from .models import Question

admin.site.register(Question)
```
で確かにQuestionがadmin画面に出てきたので、さらに工夫してみた

```
from django.contrib import admin

from .models import Question
from .models import Choice　#ここを自分で考えて入れた！

admin.site.register(Question)
admin.site.register(Choice)　#ここも自分で考えて入れた！!
```
動いた！！Choiceが加わってる！

![adminsite.png](https://qiita-image-store.s3.amazonaws.com/0/321085/e927e116-9f37-9d74-cdb2-058fd75944f3.png)

**初心者はかしこさが1上がった！**

次回Tutorial(3)へ続く