Фильтрация данных по пользователю, вошедшему в приложение Django - PullRequest
2 голосов
/ 01 мая 2011

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

За исключением представлений администратора, вошедший в систему пользователь не должен иметь доступа к данным, созданным другими пользователями. Нет общих данных между пользователями.

  • Полагаю, мне нужно добавить внешний ключ user ко всем моделям, которые я создал. Правильный?

  • Есть ли простой способ реализовать фильтрацию на основе request.user? Может ли это быть сделано более или менее автоматически, или мне нужно пройти весь код, чтобы проверить каждый запрос, выполненный в базе данных?

  • Я написал код, используя TDD, и я намерен продолжить ... Каковы лучшие стратегии для обеспечения правильной реализации пользовательской фильтрации, например, что я не забыл отфильтровать существующий запрос? Я полагаю, я могу написать тесты, которые показывают, что конкретный запрос еще не отфильтрован, и реализовать фильтр. Но как насчет запросов, которые я напишу позже? Можно ли как-то утверждать, что все существующие и будущие запросы возвращают объекты, которые принадлежат только текущему пользователю?

Спасибо.

1 Ответ

2 голосов
/ 01 мая 2011

Да, вам нужно добавить пользовательский FK.Не забывайте, что вам придется переносить таблицы базы данных - либо вручную, либо с помощью инструмента, подобного South .

. Одним из способов применения фильтра будет определение пользовательских менеджеров для вашегомодели, с for_user методом, который принимает пользователя в качестве аргумента: что-то вроде:

class ForUserManager(models.Manager):
    def for_user(self, user):
        return self.filter(user=user)

Теперь вы можете использовать этот менеджер - с подклассами и / или с миксином по мере необходимости - на всех ваших моделях,и не забывайте использовать objects.for_user(request.user) везде.

Это также упростит тестирование - ваш тест может запрограммировать этот метод for_user, чтобы он где-нибудь установил флаг или счетчик в глобальной переменной, а затем протестировалон увеличился, как и ожидалось.

Изменить в ответ на комментарий Нет, как вы подозреваете, это не сработает.Дело даже не в том, что каждый обязательно получит последнего вошедшего в систему пользователя. Дело в том, что менеджеры являются атрибутами уровня класса и, как таковые, повторно используются в процессе, поэтому любой запрос, обслуживаемый этим серверным процессом, будет использовать один и тот же.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...