Настройка нескольких баз данных django для нескольких регионов

Проблема с Django DatabaseRouter и связанными моделями

Я работаю над проектом Django с несколькими региональными базами данных. Я столкнулся с проблемой, когда при получении объекта сотрудника со связанной моделью из другой базы данных связанная модель извлекается из базы данных по умолчанию, а не из предполагаемой региональной базы данных. Setup

Two regional databases (us and potentially others)
DatabaseRouter to route models to their respective databases
The issue occurs when trying to prefetch or access related models using foreign key relationships

Импорт моделей "Шелл Плюс"

employee = Employees.objects.using('us').get(employee_id='ORG-EMP-1001') SELECT "general_employees". "org_id_id", "general_employees". "first_name", FROM "general_employees" WHERE "general_employees". "employee_id" = 'ORG-EMP-1001' LIMIT 21 Время выполнения: 0.306803 с [База данных: us]

organisation = Organisation.objects.using('us').get(pk=employee.org_id.pk) SELECT "general_organisation". "onboard_id", "general_organisation". "org_id", "general_organisation". "zip_code", FROM "general_organisation" WHERE "general_organisation". "org_id" = 'ORG-FFZN5OFF' LIMIT 21 Время выполнения: 0,021803 с [База данных: по умолчанию]

Отслеживание (последний последний вызов): File "/Users/sshva/Documents/newenv/lib/python3.10/site-packages/django/db/models/fields/related_descriptors.py", line 187, in get rel_obj = self.field.get_cached_value(instance) Файл "/Users/sshva/Documents/newenv/lib/python3.10/site-packages/django/db/models/fields/mixins.py", строка 15, in get_cached_value return instance._state.fields_cache[cache_name] KeyError: 'org_id'

Во время обработки вышеуказанного исключения произошло другое исключение:

Отслеживание (последний последний вызов): Файл "", строка 1, in File "/Users/sshva/Documents/newenv/lib/python3.10/site-packages/django/db/models/fields/related_descriptors.py", line 205, in get rel_obj = self.get_object(instance) Файл "/Users/sshva/Documents/newenv/lib/python3.10/site-packages/django/db/models/fields/related_descriptors.py", строка 168, in get_object return qs.get(self.field.get_reverse_related_filter(instance)) Файл "/Users/sshva/Documents/newenv/lib/python3.10/site-packages/django/db/models/query.py", строка 496, in get general.models.Organisation.DoesNotExist: Организация, соответствующая запросу, не существует.

class DatabaseRouter: def db_for_read(self, model, **hints): if 'database' in hints: return hints['database']. if model._meta.app_label == 'common': return 'common' return 'default'

def db_for_write(self, model, **hints): if 'database' in hints: return hints['database']. if model._meta.app_label == 'common': return 'common' return 'default'

def allow_relation(self, obj1, obj2, **hints): if obj1._state.db == obj2._state.db: return True return False

def allow_migrate(self, db, app_label, model_name=None, **hints): if db == 'common' and app_label != 'common': return False if db != 'common' and app_label == 'common': return False return True

def allow_relation(self, obj1, obj2, **hints): if 'prefetch_related' in hints: return True return obj1._state.db == obj2._state.db

Вернуться на верх