manage.pyのコマンド(1.4だけど)
django-admin と manage.py | Django documentation | Django
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ステップガイドを覚えておいてください:
- モデルを変更する (models.py の中の)
- これらの変更のためのマイグレーションを作成するために python manage.py makemigrations を実行します。
- データベースにこれらの変更を適用するために python manage.py migrate を実行します。