sql >> Base de Datos >  >> NoSQL >> MongoDB

Mezclando PostgreSQL y MongoDB (como backends de Django)

Desde Django 1.2, puede definir múltiples conexiones de base de datos en su settings.py . Entonces puede usar enrutadores de base de datos para decirle a Django a qué base de datos ir, de forma transparente para su aplicación.

Descargo de responsabilidad: así es como pienso debería funcionar, nunca he usado MongoDB en Django, ni he probado que mi código realmente funcione. :)

configuraciones.py

DATABASES = {
    'default': {
        'ENGINE': 'django_mongodb_engine',
        'NAME': 'mydata',
        ...
    }
    'geodata' {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'geodata',
        ...
    }
}

DATABASE_ROUTERS = ['path.to.ModelMetaRouter']

Modelos

Luego, agregue meta variables personalizadas a sus tablas geográficas para anular su base de datos. No agregue este atributo a los modelos que se supone que deben ir a la base de datos predeterminada.

class SomeGeoModel(models.Model):
    ...
    class Meta:
        using = 'geodata'

Enrutador de base de datos

Y escriba un enrutador de base de datos para dirigir todos los modelos que tienen el using conjunto de metaatributos, a la conexión apropiada:

class ModelMetaRouter(object):
    def db_for_read(self, model, **hints):
        return getattr(model._meta, 'using', None)

    def db_for_write(self, model, **hints):
        return getattr(model._meta, 'using', None)

    def allow_relation(self, obj1, obj2, **hints):
        # only allow relations within a single database
        if getattr(obj1._meta, 'using', None) == getattr(obj2._meta, 'using', None):
            return True
        return None

    def allow_syncdb(self, db, model):
        if db == getattr(model._meta, 'using', 'default'):
            return True
        return None