プログラミングと心理学の忘備録

自分の知識をストックしていくためのブログ

Djangoメモ

スポンサーリンク

manage.pyのコマンド(1.4だけど)
django-admin.py と manage.py — Django 1.4 documentation

1.1と1.9はこちら
django-admin and manage.py | Django documentation | Django


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

アプリケーションとは、実際に何らかの処理を行う Web アプリケーションを指します。例えばブログシステムや公開レコードのデータベース、単純な投票アプリといった具合です。プロジェクトとは、あるウェブサイト向けに設定とアプリケーションを集めたものです。一つのプロジェクトには複数のアプリケーションを入れられ ます。また、一つのアプリケーションは複数のプロジェクトで使えます。

外側(プロジェクト)の構造

mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        wsgi.py

内側(アプリ)の構造

polls/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    views.py

2017/02/02 追記
覚え方が正しいかは微妙だけど、settings.py が存在するディレクトリがプロジェクト。
migrationsが存在するディレクトリがアプリ。MVCモデルのmodelとviewがいる。

チュートリアル1の抜粋

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

プロジェクトの構造
  • 外側の mysite/ ルートディレクトリは、このプロジェクトのただの入れ物。 この名前は Django に関係しないので好きな名前に変更できる。
  • manage.py: Django プロジェクトに対する様々な操作を行うためのコマンドラインユーティリティ。
  • 内側の mysite/ ディレクトリは、このプロジェクトの本当の Python パッケージ。この名前が Python パッケージの名前であり、 import の際に 使用する名前 (例えば import mysite.urls) 。
  • mysite/__init__.py: このディレクトリが Python パッケージであることを Python に知らせるための空のファイル。
  • mysite/settings.py: Django プロジェクトの設定ファイル。
  • mysite/urls.py: Django プロジェクトの URL 宣言、Django サイトにおける「目次」に相当する。
  • mysite/wsgi.py: プロジェクトをサーブするためのWSGI互換Webサーバーとのエントリーポイント。
runserverについて

デフォルトでは runserver コマンドは内部 IP のポート 8000 で起動します。
サーバの IP を指定するときには、ポート番号も一緒に指定します。従って、 全ての IP からのリクエストを受け付ける (サーバを他のコンピュータから可視にする) には、以下のようにします:

$ python manage.py runserver 0.0.0.0:8000

チュートリアル2の抜粋

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

settings.pyについて

INSTALLED_APPSは、Djangoのインスタンスの中で有効化された全てのDjangoアプリの名前を保持する。
デフォルトで以下のアプリケーションが入っている。

  • django.contrib.admin - 管理(admin)サイト。
  • django.contrib.auth - 認証システム
  • django.contrib.contenttypes - コンテンツタイプフレームワーク
  • django.contrib.sessions - セッションフレームワーク
  • django.contrib.messages - メッセージフレームワーク
  • django.contrib.staticfiles - 静的ファイルの管理フレームワーク
migrateコマンドについて

INSTALLED_APPS の設定を参照し settings.py のデータベース設定に従って必要なすべてのデータベースのテーブルを作成する。
ちなみにmigrateは移動するとか移住するという意味。

models.py

名前通り、MVCのモデル部分。ForeignKeyで外部キー参照をすることによりQuestionとChoiceが1:他の関係になっている。
また、下記のコードにより

・アプリケーションのデータベーススキーマを作成 (CREATE TABLE 文を実行) できます。
・Question や Choice オブジェクトに Python からアクセスするためのデータベー ス API を作成できます。

from django.db import models


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


class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)
settings.py

プロジェクトにアプリを追加するたびに INSTALLED_APPSに設定を追加する。

INSTALLED_APPS = [
  'polls.apps.PollsConfig'
 …
]

INSTALL_APPSに変更があったので、makemigrateコマンドを実行

$ python manage.py makemigrations polls
Migrations for 'polls':
  0001_initial.py:
    - Create model Choice
    - Create model Question
    - Add field question to choice

0001_initial.pyというファイルができて、モデルの作成とフィールドの追加が行われた。
モデルの変更をディスク上のファイルに保存する方法とのこと。
migrateとmakemigrateの違い↓
migrate:データベースの状態を現在のモデルとマイグレーションのセットと同期させます。
makemigrate:モデルに検出された変更に基づいて新しい移行を作成します。

polls
├── migrations
│   ├── 0001_initial.py

0001_initial.py

class Migration(migrations.Migration):

    initial = True

    dependencies = [
    ]

    operations = [
        migrations.CreateModel(
            name='Choice',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('choice_text', models.CharField(max_length=200)),
                ('votes', models.IntegerField(default=0)),
            ],
        ),
        migrations.CreateModel(
            name='Question',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('question_text', models.CharField(max_length=200)),
                ('pub_date', models.DateTimeField(verbose_name=b'date published')),
            ],
        ),
        migrations.AddField(
            model_name='choice',
            name='question',
            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='polls.Question'),
        ),
    ]

で、migrateコマンドで実際のDBに同期。

$ python manage.py migrate
Operations to perform:
  Apply all migrations: admin, contenttypes, polls, auth, sessions
Running migrations:
  Rendering model states... DONE
  Applying contenttypes.0001_initial... OK
  …
  Applying sessions.0001_initial... OK

migrate コマンドはすべての適用されていないマイグレーション(Djangoはデータベース内の``django_migrations``と呼ばれる特別なテーブルを利用してどれが適用されているかを追跡しています)を捕捉してデータベースに対してそれを実行します - 重要なのは、モデルに対して行った変更はデータベースのスキーマに同期するということです。

マイグレーションは、データベースやテーブルを削除しまた新しいものを作成する必要なく、プロジェクトを開発するように、いつでもモデルを変更可能とする強力なツールです - データを失うことなしにデータベースをライブでアップグレードするよう特化しています。これらについてチュートリアルの後の部分でより深くカバーします、しかし今は、モデルの変更を実施するための3ステップガイドを覚えておいてください:

  1. モデルを変更する (models.py の中の)
  2. これらの変更のためのマイグレーションを作成するために python manage.py makemigrations を実行します。
  3. データベースにこれらの変更を適用するために python manage.py migrate を実行します。