У нас была похожая проблема. Группы Джанго ДЕЙСТВИТЕЛЬНО не подходят для этого, но вы можете включить их в чистку.
То, как мы это сделали, было следующим:
Каждый объект с контролем доступа имеет отношение ManyToMany к таблице групп. Каждая группа использовалась для определения определенного типа разрешений («можно просматривать основы пациента», «можно редактировать контактную информацию пациента» и т. Д.). Пользователи добавляются в группы, для которых у них должны быть разрешения (в вашем примере просмотра только пациентов в этой больнице у вас может быть группа "Больница с видом на долину").
Затем, когда вы переходите к отображению списка записей для пользователя, вы фильтруете на основе соединения двух групп. Пользователь должен иметь все связанные разрешения группы для просмотра данного объекта.
Если ваша система требует этого, вы можете оставить отдельное ManyToMany с отрицательными разрешениями или отдельными правами на чтение / запись. Вы также можете определить набор метагрупп (врач, медсестра), которые приведут к тому, что ваш поисковый фильтр получит фактическое подмножество разрешений.
Что касается проблемы с панелью ссылок, вы можете генерировать ее программно, используя ту же систему - фильтр на основе классов объектов, которые пользователь может видеть или редактировать, а затем использовать функцию типа get_absolute_url()
(возможно, вызвать ее). get_index_url()
) для возврата ссылок для индекса каждого класса объектов.
Поскольку все это довольно сложно, вы, вероятно, в конечном итоге захотите сделать какой-то уровень кэширования для этих вещей, но включите его, прежде чем пытаться оптимизировать. Это возможно, и это менее уродливо в коде, чем в словах.