はじめに
いつも心は虹色に! 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), ]
path('content/polls/', include('polls.urls')),
に変えると。。
その1についての疑問点
- mysite/settings.pyの
INSTALLED_APPS
のリストにpollsを書き加えていないが、Djangoの動作に支障はないのか? - アプリケーションを複数のプロジェクトで使う例が知りたい
その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.PollsConfig
4 - polls/(アプリケーション)の下のapps.pyの中のPollsConfigクラスを指定している
- 指定の仕方:
class PollsConfig(AppConfig): name = 'polls'
- モデル変更実施の3ステップ
- models.py変更
- マイグレーション作成(
makemigrations
) - データベースに変更適用(
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が操作できるようになった。
その2についての疑問点
- 内省機能とは?(原文確認する)
- 「このフィールド名(引用者注:モデルのフィールドの最初の引数のこと)は Django の二つの内省機能で使う他、ドキュメントとしての役割も果たします。」
- DjangoはRailsとは思想が違うという点をもっと詳しく知りたい。
- インタラクティブシェルで遊ぶ中で日時がUTCのところがあった
- 管理画面で見たDate publishedは日本時間で一致した(レコード作成時はJSTに合わせなくてもいいということ?)
>>> q.pub_date datetime.datetime(2018, 9, 29, 4, 44, 5, 602909, tzinfo=<UTC>)
今回はここまでです。
次回、その3(ビュー)からのアウトプットでお会いしましょう。
最後までお読みいただきありがとうございました。
-
プロジェクトを作成しよう! · Django Girls Tutorial より。「コマンドの最後にピリオド . を入力したことを確認してくださいね。」↩
-
Djangoモデル · Django Girls Tutorial より。「アプリケーションを作ったら、Djangoにそれを使うように伝えないといけません。 」↩
-
Django Girls Tutorialではblogアプリケーションを
blog
として指定しています(Djangoモデル · Django Girls Tutorial )。ここはblog.apps.BlogConfig
とも指定できると理解しました。↩ -
例:
rails generate model User name:string email:string
(Ruby on Rails チュートリアル:実例を使って Rails を学ぼう より)↩