Modelos con Múltiples Bases de Datos
1. Define la Base de Datos Externa en settings.py de la aplicación principal.
DATABASES = {
# Base de datos local por defecto.
"default": {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'local_db_name',
'USER': 'local_db_user',
'PASSWORD': 'local_db_passw',
# ...
},
# Base de datos Externa. <<<
"external_database":{ # Nombre a user en la app.
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'external_db_name',
'USER': 'external_db_user',
'PASSWORD': 'external_db_passw',
'HOST': '127.0.0.1', # o la IP externa de otro servidor.
'PORT': '5432'
},
}
2. Crea el Manager con la Configuración para obtener datos de la Base de Datos secundaria.
Crear el Manager Personalizado permite configurar otras opciones en el futuro con facilidad.
from django.db.models.manager import BaseManager as Manager
from django.db.models.query import QuerySet
class ExternalDatabaseManager(Manager.from_queryset(QuerySet)):
use_in_migrations = False # Para no sobrescribir con la aplicación local al migrar.
use_db = "external_database" # El nombre definido en la configuración de base de datos.
def get_queryset(self):
# Devuelve el queryset especificando la base de datos
# sino se debe especificar en cada llamado al ORM.
return super().get_queryset().using(self.use_db)
3. Sobrescribir atributo objects en el Modelo de la Base de Datos Externa.
from django.db import models
from .external_manager import ExternalDatabaseManager
class ExternalApplicationModel(models.Model):
# IMPORTANTE:
class Meta:
# !! Definir `app_label` para separar los modelos de la aplicación principal.
app_label = 'external_app'
# !! Definir `db_table` con el mismo nombre que en la bd externa.
db_table = 'external_app_table'
# Sobrescribe la propiedad con el Manager Personalizado.
objects = ExternalDatabaseManager()
4. Utiliza el ORM de Django como siempre.
results_from_external_db = ExternalApplicationModel.objects.all()
Autor: Martín Vilche