nikkie-ftnextの日記

イベントレポートや読書メモを発信

Django Girls Tutorial修了者が投票アプリチュートリアルでDjangoの理解を深めました(その1, 2編)

はじめに

いつも心は虹色に! nikkieです。
先日の #pyhack で、Django公式ドキュメントのチュートリアル(投票アプリ)に取り組みました。
手を動かしてみて気づいたことをアウトプットしていきます。
今回はその1(最初のビュー)とその2(モデルの作成)です。

チュートリアルの概要

はじめての Django アプリ作成、その 1 | Django documentation | Django から始まる7回構成のチュートリアルです。
作るアプリの名前をとって「投票アプリチュートリアル」と呼ぶことにします。
なお、私のDjangoレベルは「Django Girls Tutorial修了」です。
Django Girls Tutorialを終えてから投票アプリチュートリアルに取り組んだことで、Djangoへの理解が深まったと感じています。

それでは早速アウトプットしていきましょう。
最後までお付き合いいただけますと幸いです。(長めなので拾い読みも推奨します)

その1:プロジェクトとアプリケーション作成

はじめての Django アプリ作成、その 1 | Django documentation | Django

動作環境

以下の環境でチュートリアルを進めました。

(env) $ python -m django --version
2.1.1
(env) $

仮想環境のディレクトリenv/と同じ階層でdjango-admin startproject mysiteを実行したところ、env/と同じ階層に「外側のmysiteディレクトリ」ができました。

  • ├ env/
  • └ mysite/
    • ├ manage.py
    • └ mysite/
      • ├ __init__.py
      • ├ settings.py
      • ├ urls.py
      • wsgi.py

django-admin startproject mysiteは、現在のディレクトリ内にmysiteディレクトリを作り、その中にmanage.pyとmysiteディレクトリを作るようです。
Django Girls Tutorialではdjango-admin startproject mysite .1と現在のディレクトリを指定しているため、フォルダ構成が異なります(外側のmysiteディレクトリがありません)。

プロジェクトとアプリケーション

mysiteプロジェクトの中にpollsアプリケーションを作成して進めていきます。

違いについて、チュートリアルより引用。

  • 「プロジェクトとは、あるウェブサイト向けに設定とアプリケーションを集めたもの」
  • 「アプリケーションとは、実際に何らかの処理を行う Web アプリケーション」

mysite/urls.pyとpolls/urls.py

以下の例から、mysite/urls.pyは確かに「目次」だと納得しました。

URLをpolls/からfun_polls/にしたければmysite/urls.pyを変える。

urlpatterns = [
    path('fun_polls/', include('polls.urls')), # 変更
    path('admin/', admin.site.urls),
]

f:id:nikkie-ftnext:20180929171501p:plain:w400
path('content/polls/', include('polls.urls')),に変えると。。 f:id:nikkie-ftnext:20180929171502p:plain:w400

その1についての疑問点

  • mysite/settings.pyのINSTALLED_APPSのリストにpollsを書き加えていないが、Djangoの動作に支障はないのか?
    • Django Girls Tutorialではblogアプリ作成後に書き加えている2
    • 最初のビューは問題なく表示できている
    • その2に進んだら解決した
  • アプリケーションを複数のプロジェクトで使う例が知りたい

その2:モデル(QuestionとChoice)

はじめての Django アプリ作成、その2 | Django documentation | Django

データベースはデフォルトのsqliteを使っていきます。
mysite/settings.pyのTIME_ZONE にはDjango Girls TutorialにならってAsia/Tokyoを指定。3

モデル作成

  • モデルのフィールドの最初の引数は「人間可読な名前を与え」るために用いる
    • 例:pub_date = models.DateTimeField('date published')
  • mysite/settings.pyのINSTALLED_APPSに追加してアプリケーションをプロジェクトに含める(=マイグレーション対象にする
    • 指定の仕方:polls.apps.PollsConfig4
    • polls/(アプリケーション)の下のapps.pyの中のPollsConfigクラスを指定している
class PollsConfig(AppConfig):
    name = 'polls'
  • モデル変更実施の3ステップ
    1. models.py変更
    2. マイグレーション作成(makemigrations)
    3. データベースに変更適用(migrate)
  • 覚えておきたいmanage.py関連コマンド
    • python manage.py sqlmigrate polls 0001: migrateで適用されるSQLの確認
    • python manage.py check:プロジェクトに問題がないかの確認

データベースAPI

インタラクティブシェルで遊んでORMに慣れる。

  • 存在しないidを指定したとき、getはError(DoesNotExist)を上げるが、filterでは[](空のリスト)が返る
  • get(id=1)の代わりにget(pk=1)がよく使われる
  • ForeignKeyはChoiceに設定しただけ(polls/models.py)だが、Question側からも結びつくChoiceを確認できる(choice_set)

管理画面

polls/admin.pyにadmin.site.register(Question)を追加したところ、管理画面からPollsが操作できるようになった。
f:id:nikkie-ftnext:20180929171629p:plain

その2についての疑問点

  • 内省機能とは?(原文確認する)
    • 「このフィールド名(引用者注:モデルのフィールドの最初の引数のこと)は Django の二つの内省機能で使う他、ドキュメントとしての役割も果たします。」
  • DjangoRailsとは思想が違うという点をもっと詳しく知りたい。
  • インタラクティブシェルで遊ぶ中で日時がUTCのところがあった
    • 管理画面で見たDate publishedは日本時間で一致した(レコード作成時はJSTに合わせなくてもいいということ?)
>>> q.pub_date
datetime.datetime(2018, 9, 29, 4, 44, 5, 602909, tzinfo=<UTC>)

今回はここまでです。
次回、その3(ビュー)からのアウトプットでお会いしましょう。
最後までお読みいただきありがとうございました。


  1. プロジェクトを作成しよう! · Django Girls Tutorial より。「コマンドの最後にピリオド . を入力したことを確認してくださいね。」

  2. Djangoモデル · Django Girls Tutorial より。「アプリケーションを作ったら、Djangoにそれを使うように伝えないといけません。 」

  3. プロジェクトを作成しよう! · Django Girls Tutorial

  4. Django Girls Tutorialではblogアプリケーションをblogとして指定しています(Djangoモデル · Django Girls Tutorial )。ここはblog.apps.BlogConfigとも指定できると理解しました。

  5. 例: rails generate model User name:string email:stringRuby on Rails チュートリアル:実例を使って Rails を学ぼう より)