Djangoのモデル操作や参照については、
python manage.py MY_COMMAND
とかやれば出来るのだが、これはDjangoのアプリケーション配下に /app_name/management/commands/MY_COMMAND.py
として置き、BaseCommand
を継承して下記のようにしなければならない。
from django.core.management.base import BaseCommand, CommandError
class Command(BaseCommand):
def handle(self, *args, **options):
print 'hogefuga'
こうすることで、上記のmanage.py MY_COMMAND
によってDjangoの拡張コマンドとして利用することが可能になる。
Djangoのアプリと関連した何かを作りたい時は上記で良いですね。
Djangoのアプリと関係ないけどDBを参照したい
DjangoのDBを何かしらの管理情報のマスターとしている場合や、格納されている結果を使って全く別のプログラムと連携させたいときは、manage.py
の拡張ではなく、外部から呼び出す形にしたい。
Djangoの裏はただのSQLiteやMySQLなので、直接アクセスして情報を読取るってのでも良いんですが、せっかくDjangoでModelを定義したのに、そのORMを使わないのもなーと
というわけで、ORMを外部から使える方法です。
※注 : 下記の方法は、アプリをDjangoプロジェクトに依存させてしまう方法です。Djangoプロジェクトのディレクトがずれたりすれば当然、参照先も変更の必要があります。
Projectをライブラリとして読み込ませる
下記の手順で、外部からもDjangoのORMを利用できます
- sys.pathにDjangoのプロジェクトを指定
- Djangoの環境変数
DJANGO_SETTINGS_MODULE
にプロジェクトsettings.py
を指定 - modelsのimport
# !/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import sys
def CallORMapper():
sys.path.append('/YOUR/DJANGO-PROJECT')
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "DJANGO-PROJECT.settings")
objects = MODEL_NAME.objects.all()
from DJANGOAPPNAME.models import MODEL_NAME
print objects
if __name__ == "__main__":
CallORMapper()