Я искал в Интернете ответы, но мой Google-фу не совсем работает.
Мне нужно иметь разрешения на уровне объекта и рассчитывать поля на основе полей, к которым у пользователя есть доступ. Я должен использовать Джанго. Мне разрешено импортировать дополнения.
Например, рассмотрим следующий вариант использования:
Компания хотела бы предоставить систему отслеживания запасов для
продавцы и менеджеры.
Система отслеживает, сколько инвентаря каждый продавец начинает в месяц
с тем, сколько они продали в этом месяце, и сколько инвентаря они
есть оставшиеся (вычисляемое поле: (start_inventory - sold_inventory =
currentInventory)).
Продавец может видеть только начальные, проданные и текущие запасы за
сами по себе.
Менеджер может видеть все начальные, проданные и текущие запасы для
продавцы, которыми они управляют.
Теперь в модели записаны начальный и проданный инвентарь - и довольно просто использовать что-то вроде get_objects_for_user()
Джанго-стража только для начального и проданного инвентаря ... но для текущего инвентаря?
Моей первой мыслью было определение функции или менеджера с функцией в model.py, которая возвращает модель + вычисленное текущее поле инвентаря.
Однако, поскольку этот метод находится в model.py ... Я не могу использовать get_objects_for_user()
, чтобы гарантировать, что я делаю вычисления только для полей, к которым у пользователя есть доступ. Это потому, что модели не имеют доступа к запросам ... без какого-либо взлома и, возможно, введения связи?
Из-за осторожности я оглядываюсь назад к своему view.py. Я использовал общий список, и я переопределяю метод get_queryset()
, чтобы я мог вставить свое собственное поведение. Затем я могу использовать get_objects_for_user()
, затем добавить вычисляемое поле в представление ... чувак, это тоже не совсем правильно.
Выполнение этого будет означать, что мои расчетные объекты связаны с видом, а не с данными. Если мне нужно отобразить эти данные в нескольких представлениях, мне придется каждый раз перезаписывать их ...
И вот где я застреваю. Я не могу найти или понять, как элегантно реализовать это поведение.
Я имею в виду, что корень моей идеи состоял в том, чтобы изменить контекст представления на основе разрешений пользователя. То есть все разделяют представление, но context_object
/ queryset
меняется в зависимости от прав пользователя.
Не знаю, умно ли это, или этот подход блокирует мою способность находить решение, но утаптывать его и гуглить его не работает.
Что ж, позвольте мне добавить несколько заключительных ограничений к приемлемому решению:
Хранение дополнительных данных / рассчитанных полей в модели может быть
считается невозможным (предположим, что система может быть расширена до
требуется много вычисляемых полей).
Спасибо за любую помощь!