Настройка нескольких баз данных 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