LoginSignup
9
12

More than 5 years have passed since last update.

外部アプリからもDjangoのORMを使ってDBを操作したい

Posted at

Djangoのモデル操作や参照については、

python manage.py MY_COMMAND

とかやれば出来るのだが、これはDjangoのアプリケーション配下に /app_name/management/commands/MY_COMMAND.pyとして置き、BaseCommandを継承して下記のようにしなければならない。

MY_COMMAND.py
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
ORM_test.py
#!/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()

参考

9
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
12