0からのDjango開発環境構築から基本操作まで

備忘録&身内用なのでかなり簡略的に書いてあります。初学者は他の記事も参考にするべきだと思います。

#### バージョンの注意
ここでは主にpython 2.7.10, Django 1.6で作業した。
python 3系, Django1.9で作業する時は下記の点に注意

`$ pyenv install `時に適切なバージョンを選択する
`$ pip install django`時に適切なバージョンを選択する。(デフォルトで最新の1.9が入る)

Django1.6だと モデル書いてから ` $ python manage.py syncdb ` 一発でデータベースが作成される感じ。
1.9だとモデル書いてから
` $ python manage.py makemigrations アプリ名 ` でマイグレーションファイル作ってから
` $ python manage.py  migrate`でマイグレーションファイルからDBを作成する感じ。

以上（たぶん）。 

## 1. 環境構築

### 1-1.pyenv をインストール

GitHubからインストール

```
$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv
```

(~/.pyenvはローカルのディレクトリ名。適当な名前にする)
pyenvの設定をzshenv、bash_profile等に書き込む。

```
export PYENV_ROOT=$HOME/.pyenv
export PATH=$PYENV_ROOT/bin:$PATH
eval "$(pyenv init -)"
```

(`$HOME`はpyenvのインストール場所に適宜書き換える)
Shellを再起動して設定を反映させる。

```
$ exec $SHELL
```

### 1-2. pythonのインストール
pyenvからpythonをインストールする。

```
$ pyenv install 2.7.10
```

インストールしたバージョンをセット。

```
$ pyenv global 2.7.10
$ pyenv rehash
```

確認

```
$ pyenv versions
* 2.7.10 (set by /hoge/.pyenv/version)
```

### 1-3. Djangoのインストールとテストプロジェクト作成

pip からDjango1.6のインストール

```
$ pip install django==1.6
```

テストプロジェクト作成

```
$ django-admin.py startproject mysite
```

サーバー起動

```
$ cd mysite
$ python manage.py runserver
```

http://localhost:8000 にアクセスし、サーバーが動いてるか確認する。


## 2. Djangoのテストプロジェクト

### 2-1. 基本的な使用方法

主な参照 [はじめての Django アプリ作成、その 1 | Django 1.4 Documentation](http://docs.djangoproject.jp/en/latest/intro/tutorial01.html)

#### 設定ファイル(setting.py)の編集

DBに関する設定を変更する。デフォルトではsqliteが使われる設定だが、今回はPostgreSQLを使用する。
参照  [DjangoでPostgreSQLを使えるようにしたときのメモ | Qiita](http://qiita.com/asigochan/items/b5b7c497fc40c0ef5811)
上記サイトを参考にpostgresqlのライブラリなどをインストールし、新しいユーザーとデータベースを作成したと仮定。

setting.py

```python
DATABASES = {
    'default': {
        # 'ENGINE': 'django.db.backends.sqlite3',
        # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'mysite',
        'USER': 'djangouser',
        'PASSWORD': 'pass',
        'HOST': '127.0.0.1',
        'PORT': 5432,
    }
}
```

#### テーブルの作成

下記コマンドを実行することでsetting.py中の INSTALLED_APPSに記述されているアプリケーションで使われるテーブルを作成する。

```
$ python manage.py syncdb
```

(syncdb コマンドは INSTALLED_APPS 設定を探し、 settings.py のデータベース設定に従ってデータベース上に必要なテーブ ルを作成する。)


#### アプリケーションの作成

```
$ python manage.py startapp polls
```

(pollsはアプリケーション名)

#### モデルの作成

```python:polls/models.py
from django.db import models

class Poll(models.Model):
    question = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

class Choice(models.Model):
    poll = models.ForeignKey(Poll)
    choice = models.CharField(max_length=200)
    votes = models.IntegerField()
```

#### プロジェクトにpollsアプリを認識させる

プロジェクトにpollsアプリを認識させるために設定を書き換える。
`INSTALLED_APPS`内に`polls`を追加。

```python:setting.py
INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # Uncomment the next line to enable the admin:
    # 'django.contrib.admin',
    # Uncomment the next line to enable admin documentation:
    # 'django.contrib.admindocs',
    'polls',
)
```

#### 作成したモデルからSQLを表示させる

```
$ python manage.py sql polls
BEGIN;
CREATE TABLE "polls_poll" (
    "id" serial NOT NULL PRIMARY KEY,
    "question" varchar(200) NOT NULL,
    "pub_date" timestamp with time zone NOT NULL
)
;
CREATE TABLE "polls_choice" (
    "id" serial NOT NULL PRIMARY KEY,
    "poll_id" integer NOT NULL REFERENCES "polls_poll" ("id") DEFERRABLE INITIALLY DEFERRED,
    "choice" varchar(200) NOT NULL,
    "votes" integer NOT NULL
);
COMMIT;
```

#### モデルからSQL文を発行し、DBに書き込む

```
$ python manage.py syncdb
```

#### Python の対話シェルでDjangoのAPIを遊ぶ


参照 [はじめての Django アプリ作成、その 1 | Django 1.4 Documentation](http://docs.djangoproject.jp/en/latest/intro/tutorial01.html#api) のAPIで遊んでみるより。

pythonの対話シェルを起動する。
```
$ python manage.py shell
```
(上記サイトを参考にして色々遊ぼう)

ちなみに遊ぶ過程でpolls/models.pyを下記のように書き換えた。

```python:polls/models.py
import datetime
from django.utils import timezone
from django.db import models

class Poll(models.Model):

    question = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

    def __unicode__(self):
        return self.question

    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)


class Choice(models.Model):

    poll = models.ForeignKey(Poll)
    choice = models.CharField(max_length=200)
    votes = models.IntegerField()

    def __unicode__(self):
        return self.choice

```