0. 概要

作成中のアプリケーションでは、postgressと、mongodbを使っていますが、
* 2つに分かれているのには深い理由はございません。
ER図がカオスになってきて、postgressのmodelのみ、Django の ER図 出力 が 2ステップで出来た
ER図は出力していたのですが、mongodb側もなんとかしたくなり、
mongodb側のmodel設定をしてみましたが、できませんでした。。。
意味があるかどうかは不明ですが、
ダメであることがわかるまでの手順をメモします。


1. 参考サイト


2. 手順

2-0. 実施環境 / 前提 ※ダメなことを確認するための前提

  1. virtualenv が install済であること
  2. 実施環境
  • ProductName: Mac OS X
  • ProductVersion: 10.10.5
  • BuildVersion: 14F1713
  • Django (1.9.5)

2-1. Django-nonrel のinstall

pip install git+https://github.com/django-nonrel/django@nonrel-1.5

※ここで気付けばよかったですが、気づかず。。


2-2. djangotoolbox の install

pip install git+https://github.com/django-nonrel/djangotoolbox

Collecting git+https://github.com/django-nonrel/djangotoolbox
  Cloning https://github.com/django-nonrel/djangotoolbox to /tmp/pip-CEdEQY-build
Installing collected packages: djangotoolbox
  Running setup.py install for djangotoolbox ... done
Successfully installed djangotoolbox-1.8.0


2-3. Django MongoDB Engine の intall

pip install git+https://github.com/django-nonrel/mongodb-engine


2-4. Databaseの設定

settings.pyにmongodbの設定を追加
※ defaultでRDBの設定があるので、default_mongodbを追加しました。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'festival4partypeople',
        'USER': 'festival4partypeople',
        'PASSWORD': 'xxxxxxxxxx',
        'HOST': 'localhost',
        'PORT': '',
    },
    'default_mongodb': {
        'ENGINE': 'django_mongodb_engine',
        'NAME': 'festival4partypeople',
    }
}

DATABASE_ROUTERS = ['festival4partypeople.router.DatabaseRouter']


2-5 routers.pyの作成

class名の末尾が“Doc”で終わる場合、“default_mongodb”を使用するようにします。 ※ 動くか不明です。

class DatabaseRouter:

    def db_for_read(self, model, **hints):
        class_name = model.__class__.__name__
        if class_name.endswith("Doc"):
            return 'default_mongodb'

    def db_for_write(self, model, **hints):
        class_name = model.__class__.__name__
        if class_name.endswith("Doc"):
            return 'default_mongodb'

    def allow_relation(self, obj1, obj2, **hints):
        class_name1 = obj1.__class__.__name__
        class_name2 = obj2.__class__.__name__
        if class_name1.endswith("Doc") or \
           class_name2.endswith("Doc"):
            return True

    def allow_migrate(self, db, app_label, model=None, **hints):
        class_name = model.__class__.__name__
        if class_name.endswith("Doc"):
            return db == 'default_mongodb'


2-6. Models.pyの作成 MongoDB関連のmodelにdocをつける

# -*- coding: utf-8 -*-
from django.db import models
from djangotoolbox.fields import ListField
from djangotoolbox.fields import EmbeddedModelField

# ---------------------------------------------------
# Mongo関連
# ---------------------------------------------------


class EchonestArtistProfileDoc(models.Model):

    id = models.TextField()
    yearsActive = ListField(EmbeddedModelField('YearsActiveDoc'))


class SoundCloudTrackDoc(models.Model):

    _artistId = models.TextField()
    waveform_url = models.TextField()
    video_url = models.TextField()

2-8. ER図出力

python manage.py graph_models -a -g -o docs/er.png

  File "/Users/xxxxxx/Bitbucket/festivals4partypeople/festivals4partypeople/models.py", line 340, in <module>
    class EchonestArtistProfileDoc(models.Model):
  File "/Users/xxxxxx/.virtualenvs/v3.4.3/lib/python3.4/site-packages/django/db/models/base.py", line 189, in __new__
    new_class.add_to_class(obj_name, obj)
  File "/Users/xxxxxx/.virtualenvs/v3.4.3/lib/python3.4/site-packages/django/db/models/base.py", line 324, in add_to_class
    value.contribute_to_class(cls, name)
  File "/Users/xxxxxx/.virtualenvs/v3.4.3/lib/python3.4/site-packages/djangotoolbox/fields.py", line 79, in contribute_to_class
    self.item_field.model = cls
  File "/Users/xxxxxx/.virtualenvs/v3.4.3/lib/python3.4/site-packages/djangotoolbox/fields.py", line 274, in _set_model
    if model is not None and isinstance(self.embedded_model, basestring):
NameError: name 'basestring' is not defined

2-9. NameError: name ‘basestring’ is not defined を調べる。

django-nonrelは python3 対応がされていないということを知りました。
以下のdjango-mongoengineであれば、django1.9でも使用できそうですが、
django のModelクラスで動くわけではなさそうなので、
今回の用途には使えないかなと。。

何か別の方法でER図を出力できないか考えたいと思いました。
以上です。

コメント