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 все явные действия, и предпочтительнее в результате.

Другие вопросы по тегам