5分で始める Django(入門編)
スポンサーリンク
こんにちは!racchai です。
最近のマイブームは Django です。
本当に便利なのでみんなもっと使った方がいいのに!
ということで、簡単に導入方法などを書いていきます。
なお、これから出てくるコマンドおよびコード類は写経してたら5分で終わりませんので、コピペを推奨します。
はじめに
Django をインストールしましょう。
pip を使うのが簡単なので、合わせてインストールしちゃいます。
$ easy_install pip $ sudo pip install django
プロジェクトを作る
次にプロジェクトを作成するのですが、これは以下のコマンドを実行するだけ。 django-admin コマンドはさきほどの Django のインストールで入ったものです。
$ django-admin startproject racchai
たったこれだけでプロジェクトのひな形が自動生成されてしまいます。簡単ですね!
racchai プロジェクトに移動すると、直下に manage.py
というのがいるので、これを実行してみます。
$ ./manage.py Type 'manage.py help <subcommand>' for help on a specific subcommand. Available subcommands: [auth] changepassword createsuperuser [django] check compilemessages createcachetable dbshell diffsettings dumpdata flush inspectdb loaddata makemessages makemigrations migrate runfcgi shell showmigrations sql sqlall sqlclear sqlcustom sqldropindexes sqlflush sqlindexes sqlmigrate sqlsequencereset squashmigrations startapp startproject syncdb test testserver validate [sessions] clearsessions [staticfiles] collectstatic findstatic runserver
という具合に、サブコマンド一覧が表示されますので、この開発ツールを使って作業を進めていくわけですね。
例えば、開発サーバーを起動するときは
$ ./manage.py runserver
てな具合です。
データベースを作ってみよう
みなさんお待ちかねのデータベースの時間です。
racchai プロジェクト直下に、さらに racchai ディレクトリが作成されていますので、ここに models.py
なるファイルを作りましょう。
今回はライターさんと、そのライターさんが書いた記事を管理する感じで作ります。
$ cat > racchai/models.py <<EOF from django.db import models class Writer(models.Model): name = models.CharField(max_length=128) class Article(models.Model): writer = models.ForeignKey(Writer, related_name='articles') title = models.CharField(max_length=512) contents = models.TextField() EOF
次に上記が認識されるよう、racchai/settings.py
にて INSTALLED_APPS に racchai
を追加します。
# Application definition INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', + 'racchai', )
準備ができたら、マイグレーションファイルを作成します。
$ ./manage.py makemigrations racchai Migrations for 'racchai': 0001_initial.py: - Create model Article - Create model Writer - Add field writer to article
マイグレーションファイルの作成に成功したら、あとはマイグレーションを実行すれば完了です。
$ ./manage.py migrate Operations to perform: Synchronize unmigrated apps: staticfiles, messages Apply all migrations: admin, contenttypes, racchai, auth, sessions Synchronizing apps without migrations: Creating tables... Running deferred SQL... Installing custom SQL... Running migrations: Rendering model states... DONE Applying contenttypes.0001_initial... OK Applying auth.0001_initial... OK Applying admin.0001_initial... OK Applying contenttypes.0002_remove_content_type_name... OK Applying auth.0002_alter_permission_name_max_length... OK Applying auth.0003_alter_user_email_max_length... OK Applying auth.0004_alter_user_username_opts... OK Applying auth.0005_alter_user_last_login_null... OK Applying auth.0006_require_contenttypes_0002... OK Applying racchai.0001_initial... OK Applying sessions.0001_initial... OK
これでデータベースの作成が完了です!
データベースにアクセスしてみる
せっかくなので、Django の ORM 経由でデータベースを操作してみましょう。
まずはインタラクティブコンソールを立ち上げます。
$ ./manage.py shell
起動できたら全ライターを取得してみます。
>>> from racchai.models import Writer >>> Writer.objects.all() []
結果は0件! 何もデータが入っていないので当然ですね。
では何かデータを入れてみましょう。
>>> Writer(name='racchai').save() >>> Writer.objects.all() [<Writer: Writer object>]
今度は1件取得できました!
ちなみにどんな SQL が実行されているかを覗いてみることもできます。
>>> str(Writer.objects.all().query) 'SELECT "racchai_writer"."id", "racchai_writer"."name" FROM "racchai_writer"'
シンプル!
次は Article のデータも入れてみます。
>>> from racchai.models import Article >>> writer = Writer.objects.all().first() >>> Article(writer=writer, title='title1', contents='contents1').save() >>> Article(writer=writer, title='title2', contents='contents2').save() >>> Article.objects.all() [<Article: Article object>, <Article: Article object>]
Articleのデータを2件入れてみました。
そうなると、Article
の Writer
を取得したい、または逆に Writer
が所有する Article
の一覧を取得したい、のような操作がしたくなるのが世の常ですね。
ではやってみます。
ArticleのWriterを取得
>>> article = Article.objects.all().first() >>> article.writer <Writer: Writer object>
Writerが所有するArticleの一覧を取得
>>> writer = Writer.objects.all().first() >>> writer.articles.all() [<Article: Article object>, <Article: Article object>]
直観的で美しいインターフェイスですね!
API 経由でデータを出力してみる
せっかくなので、さきほど作ったデータを API で出力してみましょう。
以下の2ファイルを作成します。
views.py
$ cat > racchai/views.py <<EOF import json from django.http import HttpResponse from django.core import serializers from racchai.models import Article def show_articles(request): return HttpResponse(serializers.serialize("json", Article.objects.all())) EOF
urls.py
$ cat > racchai/urls.py <<EOF from django.conf.urls import url from racchai import views urlpatterns = [ url(r'^articles$', views.show_articles), ] EOF
/articles
へアクセスすることで、すべての Article のデータを JSON 形式で出力する準備ができました。
開発サーバーが起動できるかを確認してみます。
$ ./manage.py runserver
開発サーバーの起動に成功したら、/articles
へアクセスしてみましょう。
$ curl http://localhost:8000/articles [{"fields": {"writer": 1, "contents": "contents1", "title": "title1"}, "model": "racchai.article", "pk": 1}, {"fields": {"writer": 1, "contents": "contents2", "title": "title2"}, "model": "racchai.article", "pk": 2}]
おめでとうございます!
無事、クセが強い JSON レスポンスが取得できましたね!
まとめ
いかがでしたでしょうか。
今回は導入編ということで、データベースを作ってそのデータを出力するところまでをさらっと解説してみました。
Django だけでも非常に便利ですが、Django REST framework というフレームワークと組み合わせることで
API の開発をもっと楽に進めることができます。
次回以降はそのあたりに触れつつ、django 開発をする中で得られた知見などを共有していければなと思います。
それではまた!