Django: django-admin.py, manage.py
目次

django-admin と manage.py の違い

  • 通常、単体の Django プロジェクトを用いる場合、 django-admin よりも manage.py の方が簡単に利用できる

  • django-admin, manage.py, python -m django はすべて同じことができる ( startproject 後は)

django-admin.py, django-admin

  • インストールすると使えるようになる

  • 基本的にどこからでも利用できる

  • Django を setup.py ユーティリティを通じてインストールした場合は django-admin スクリプトはシステムのパスが通っている場所に配置されます。もしパスが通った箇所に存在しなければ、Python インストール先の site-packages/django/bin 内で見つける事ができます。そのスクリプトに対して、 /usr/local/bin 等のパスが通っている場所からシンボリックリンクを張ることを検討してください。

  • 新しく Django プロジェクトを作成するときに利用する

  • Django プロジェクトを作成してしまったら manage.py が使えるようになるので出番がなくなる

manage.py

  • startproject でプロジェクトを作成すると自動で作成される

  • Django が提供する便利な管理コマンドが使えるほか...

よく使う Django 管理コマンド

プロジェクト作成

# プロジェクトのディレクトリに移動する
$ cd project_dir
# django-admin.py startproject <設定ディレクトリ名> <つくる場所>
$ django-admin.py startproject config .

アプリケーション作成

# プロジェクトのディレクトリに移動する
$ cd project_dir
# python manage.py startapp <アプリケーション名>
$ python manage.py startapp account
  • 作成後、 settings.py > INSTALLED_APPS に手動でアプリケーションを追加する

マイグレーション

https://docs.djangoproject.com/en/2.2/topics/migrations/

# マイグレーションファイルを作成する
# python manage.py makemigrations [<アプリケーション名>]
$ python manage.py makemigrations account

# 作成される予定のマイグレーションを表示する。実際のマイグレーションファイルは作成されない。
$ python manage.py makemigrations --dry-run

# マイグレーションを実行する
# python manage.py migrate [<アプリケーション名>]
$ python manage.py migrate account

# マイグレートするデータベースを指定する。デフォルトは default 。
$ python manage.py migrate --database <DATABASE>
$ python manage.py migrate --database hey

# 適用済みとして django_migrations にレコードは INSERT されるけれど、データベーススキーマを変更するために実際にSQLを実行することはありません。
$ python manage.py migrate --fake

# 自動生成されるマイグレーション名を任意の名前に変更したい
$ python3 manage.py makemigrations book --name add_field_to_book

# マイグレーションファイルがどこまで migrate されているか確認する
$ python3 manage.py showmigrations

# shop アプリケーション関連のテーブルを 0001_initial 適用直後の状態に戻したい
$ python3 manage.py migrate shop 0001_initial
  • django_migrations テーブル: Django がマイグレーション履歴を管理しているテーブル

スーバーユーザー作成

$ python manage.py createsuperuser
  • 管理サイト (Django Admin) を使えるユーザー

    • superuser (システム管理者)

    • is_staff = True かつ is_active = True

runserver

# 開発用の Web サーバーを起動する
# python manage.py runserver [<IPアドレス>:<ポート番号>]
$ python manage.py runserver 0.0.0.0:8000

# 自動リロード機能を OFF で起動
$ python manage.py runserver 0.0.0.0:8000 --noreload
  • runserver: Django に同梱されている軽量の Web サーバー

    • 開発時 (基本は DEBUG = True) のみに使われることを想定した WebServer

    • 本番環境では絶対使わない

    • 自動リロード機能

    • 静的ファイルの自動配信機能

  • IPアドレスとポート番号を省略すると 127.0.0.1:8000 で起動する

  • Docker 上で runserver => ホストOSのブラウザから 127.0.0.1:8000 に接続できないときは、 0.0.0.0:8000 で起動してみる

インタラクティブモードで実行する

# こうとか
$ python manage.py shell
# こうとか
$ DJANGO_SETTINGS_MODULE=settings._ python manage.py shell
# こう
$ python manage.py shell --settings=settings._
  • Django のプロジェクト設定を読み込んだ REPL を起動してくれる

使用例

$ python manage.py shell --settings=settings._
Python 2.7.7 (default, Dec 11 2017, 18:45:38)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-18)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from myapp.models import Entry
>>> from django.db.models import Q
>>> target_entry_id = None
>>> Entry.objects.filter(
...     Q(expiration_year_month__gte=target_entry_id) |
...     Q(expiration_year_month__isnull=True)
... )

Django の DBシェルでローカルDBにつなぐ

$ python manage.py dbshell --settings=settings.local

静的ファイルを公開用ディレクトリに収集する

$ python3 manage.py collectstatic
  • runserver には静的ファイル自動配置機能が備わっているので runserver 時には事前実行不要

System check framework を使って、Django プロジェクトの一般的な問題を検査する

使用例 (python2)

$ DJANGO_SETTINGS_MODULE=settings.local python -Wd manage.py check