Тъй като Django не поддържа Postgres схеми на база данни от кутията, за да накарате това да работи, използвайте рутер за база данни.
Създадох тестова база данни, за да изпробвам това, ето как да го възпроизведем:
Създайте тестова база данни с psql:
CREATE USER tester WITH PASSWORD 'lol so easy';
CREATE DATABASE multi_schema_db WITH OWNER tester;
CREATE SCHEMA samples AUTHORIZATION tester;
CREATE TABLE samples.my_samples (
id INTEGER NOT NULL PRIMARY KEY,
description CHAR(255) NOT NULL
);
Добавете схемите към настройките като различни връзки към базата данни, не забравяйте да добавите HOST
за да избегнете грешката „Удостоверяването на партньора е неуспешно“.
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'OPTIONS': {
'options': '-c search_path=django,public'
},
'NAME': 'multi_schema_db',
'USER': 'tester',
'PASSWORD': 'lol so easy',
'HOST': 'localhost'
},
'samples': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'OPTIONS': {
'options': '-c search_path=samples,public'
},
'NAME': 'multi_schema_db',
'USER': 'tester',
'PASSWORD': 'lol so easy',
'HOST': 'localhost'
},
}
След това създайте MySample
модел:
from django.db import models
class MySample(models.Model):
description = models.CharField(max_length=255, null=False)
class Meta:
managed = False
db_table = 'my_samples'
Създайте рутер за база данни, за да насочите всички заявки, свързани с извадката, към примерната база данни:
from database_test.models import MySample
ROUTED_MODELS = [MySample]
class MyDBRouter(object):
def db_for_read(self, model, **hints):
if model in ROUTED_MODELS:
return 'samples'
return None
def db_for_write(self, model, **hints):
if model in ROUTED_MODELS:
return 'samples'
return None
По принцип рутерът ще насочва всички модели, посочени в ROUTED_MODELS, към връзката с базата данни samples
и върнете None за всички останали модели. Това ще ги насочи към default
връзка с базата данни.
Накрая добавете рутера към вашите настройки.py
DATABASE_ROUTERS = ('database_test.db_router.MyDBRouter',)
И сега, когато правите заявка за MySample
модел, той ще извлича данни от samples
схема.