Использование унаследованной базы данных с masterdata в django

У меня есть база данных, которая используется в другом проекте, содержащая, скажем, информацию о сотрудниках. Мне нужно использовать эту информацию в своем проекте: У меня есть пользователь, и мне нужно установить его должность (как ForeignKey). Это название должности хранится в старой базе данных.

Я настроил свой проект на работу с несколькими базами данных и проверил свою унаследованную базу данных. Затем я создал модель с полем job_title = models.ForeignKey(Employee, related_field='foo').

БД Legacy вообще не может быть изменена.

Насколько я понимаю, есть две проблемы:

  1. Если я не могу модифицировать унаследованную базу данных, то у меня не может быть related_field.
  2. Django не поддерживает кросс-базовые отношения.

Как правильно работать с двумя базами данных?

P.S. Django 5 Postgrsql DB

Если я не могу изменить db другого проекта, то у меня не может быть related_name.

Сам related_name=… [Django-doc] не имеет никакого влияния на базу данных. Он просто используется для того, чтобы сделать запросы более совместимыми. Например, для получения объектов модели, относящихся к определенному Empolyee в данном случае. Если вы таким образом используете related_name='foo', вы можете использовать my_employee.foo.all(), и он сделает запрос к базе данных, где вы определили модель с этим полем. Учитывая, что вы не делаете никакой дополнительной фильтрации, это работает, если же задействованы модели, хранящиеся в действительно другой базе данных, то могут возникнуть проблемы, но это не имеет никакого отношения к самому related_name=….

Django не поддерживает кросс-базовые отношения.

Ну, он может работать с отношениями, как в определении столбцов без FOREIGN KEY ограничений, и таким образом, если ему нужны модели с job_title_id = 42, он может получить их в другой базе данных. Если есть две физически разные базы данных, то есть не разные схемы в одной базе данных, он действительно не может делать запросы, требующие таблиц из двух разных баз данных, поскольку это означает, что вы делаете JOIN между данными, предоставляемыми разными движками. Однако некоторые запросы могут работать, поскольку в реальности задействована только одна база данных.

Это, вероятно, самое большее, что может сделать ORM. Можно, конечно, создать в самом Django инструментарий, который будет получать данные из одной базы данных, а затем из другой, и выполнять JOIN и фильтрацию в самом Django. Но, скорее всего, это будет неэффективно, а также может привести к большим затратам памяти: база данных часто не делает JOIN полностью перед фильтрацией и возвратом результатов, так как ome может, например, интересовать только первые 25 результатов, а это приведет к бесполезной работе и может сильно увеличить использование базы данных. Вот несколько причин, по которым выбор различных физических баз данных часто не является хорошей идеей.

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