Обработка повторяющегося содержимого в приложениях django

В настоящее время я создаю инструмент на Django для управления проектной информацией в инженерном отделе. Идея заключается в том, чтобы иметь общий каталог элементов, доступный для всех проектов. Однако проекты будут ограничены на основе групп пользователей. Для каждого проекта можно импортировать элементы из каталога и изменять их внутри проекта. Существует требование, что каждый проект должен быть связан с отдельной базой данных.

Я не совсем уверен, как подойти к этой проблеме. Из того, что я прочитал, решение, которое я придумал, заключается в том, чтобы иметь несколько приложений django. Одно представляет общий каталог товаров (связанный со своей собственной базой данных), а затем приложение для каждого проекта (которое может писать и читать из своей собственной базы данных, но может дополнительно читать и из общей базы данных каталога товаров). Таким образом, я могу ограничить, какой пользователь может получить доступ к какой базе данных/проекту. Однако проблема этого решения в том, что оно не DRY. Все проекты выглядят одинаково: те же модели, те же формы, те же шаблоны. Они просто связаны с разными базами данных, и я не знаю, как сделать это умным способом (без копирования-вставки целых файлов, потому что я думаю, что управление этим будет мучением).

Я подумал, что этого можно избежать, изменяя метку базы данных при выполнении запросов (используя атрибут using) в зависимости от группы аутентифицированного пользователя. Проблема в том, что один пользователь может иметь доступ к нескольким проектам. Итак, я снова в растерянности.

Я буду признателен за любой ваш вклад/опыт.

По-моему, все, что вам нужно, это одно приложение, которое будет правильно управлять доступом.

Если требование состоит в том, чтобы иметь отдельные БД, то я не буду спорить, но ... всегда есть небольшой шанс, что отдельные таблицы в одной БД - это то, что они примут

Приложения Django не разделяют объекты, они являются способом структурирования вашей кодовой базы. Идея заключается в том, что приложение может быть повторно использовано в других проектах. Иметь отдельное приложение для каталога товаров и для проектов - хорошая идея, но если у вас небольшая кодовая база, то это не проблема.

Если я правильно понял ваше сообщение, вы хотите, чтобы базы данных разных отделов были разделены. Это, по сути, вопрос о многопользовательской эксплуатации, что само по себе является большой темой, есть несколько вариантов:

  1. Разделение кода - все ваши проекты/отделы существуют в единой базе данных и схеме, но разделены кодом, который фильтрует отделы в зависимости от того, кто является конечным пользователем (буквально с помощью Django .filters()). Это легко сделать, но есть риск, что данные могут быть переданы не тому пользователю, если вы неправильно составите код. Я бы рекомендовал этот вариант для вашего случая использования.

  2. Разделение схем - вы все еще используете одну базу данных, но каждый отдел имеет свою собственную схему. Для этого вам придется использовать Postgresql, но после создания схемы вероятность того, что данные будут видны не тому пользователю, гораздо меньше. Существуют некоторые библиотеки Django, такие как django-tenants, которые могут сделать большую часть тяжелой работы.

  3. Разделение базы данных - каждый отдел имеет свою собственную базу данных. Вероятность утечки данных еще меньше, но вам придется управлять несколькими базами данных, и их сложнее масштабировать. Вы можете управлять этим через django, так как там есть поддержка нескольких баз данных.

  4. Разделение приложений - каждый отдел имеет не только свою собственную базу данных, но и свой собственный экземпляр приложения. Разделение абсолютное, но опять же вам нужно управлять несколькими приложениями на хосте вроде Heroku, который еще менее масштабируемый.

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