らっちゃいブログ

日々の学びと気づきを発信するブログ

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件入れてみました。

そうなると、ArticleWriter を取得したい、または逆に 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 開発をする中で得られた知見などを共有していければなと思います。

それではまた!

racchai.hatenablog.com

racchai.hatenablog.com