Django auth_user - лучшая практика для исключения неактивных пользователей
Наше приложение устанавливает is_active
поле в пользовательской модели, чтобы False
представлять удаленного пользователя.
Как лучше исключить удаленных пользователей ( where is_active=False
) от каждого доступа к пользовательской таблице?
Пожалуйста, примите во внимание следующее:
1. Приложение уже написано, поэтому мы будем признательны за минимальные изменения кода.
2. Приложение использует: request.user
, get_object_or_404()
и конечно User.objects
Таким образом, решение должно учитывать все из них.
Из проведенного исследования я обнаружил:
1. Модель прокси: заставит меня сделать много изменений в коде; Я не знаю как это работает request
а также get_object_or_404()
,
2. contribute_to_class
: Можно ли использовать для переопределения objects
менеджер или просто добавить новый? Это безопасно?
3. Изменения промежуточного программного обеспечения: я не хочу вдаваться в подробности. Слишком рискованно для меня.
Есть ли элегантный способ сделать это?
1 ответ
Там нет никакого способа сделать это, и вы не должны пытаться. Единственный способ ограничить каждое действие набором экземпляров модели - это ограничить набор запросов по умолчанию, который затем эффективно отбрасывает исключенные экземпляры, не предоставляя возможности получить к ним доступ снова. Документы Django явно предупреждают об этом.
Если вы переопределите
get_query_set()
метод и отфильтровать все строки, Django будет возвращать неверные результаты. Не делай этого. Менеджер, который фильтрует результаты вget_query_set()
не подходит для использования в качестве автоматического менеджера. (акцент мой)
"Автоматические" менеджеры в основном такие же, как и менеджеры по умолчанию. Это то, что используется для смежных областей, в админке Django и в бесчисленных других областях механизма Django. Если вы ограничите менеджер по умолчанию, вы ограничите все по всем направлениям.
Теперь есть другие варианты быстрого доступа к ограниченному набору запросов; они просто не являются "автоматическими", а это значит, что вы все равно должны использовать их вместо того, чтобы все происходило по волшебству. Однако в этом отношении "магия" нарушает одного из основных арендаторов Python: явное лучше, чем неявное. Ограничение User
queryset по умолчанию является неявным действием. Фильтрация набора запросов вручную, обращение к пользовательскому методу менеджера или использование подкласса User
все явные действия, и предпочтительнее в результате.