Поля Django - Как добавить префикс в значение db поля на основе значения другого поля? - PullRequest
0 голосов
/ 06 сентября 2018

Я пытаюсь указать пространство имен в поле имени пользователя объекта пользователя в зависимости от значения is_staff.

Например;

  • Сохранение пользователя с именем пользователя «Username123» и is_staff = False создаст объект пользователя в базе данных со значением «customer: Username123»
  • Сохранение пользователя с именем пользователя 'Username123' и is_staff = True создаст объект пользователя в базе данных со значением 'staff: Username123'

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

Я рассмотрел использование методов from_db_value и get_prep_value , но они не предоставляют объект пользователя (таким образом, нет способа определить значение is_staff). pre_save предоставляет доступ к пользовательской модели, но не помогает при запросах например .filter(username='Username123', is_staff=True) для фильтрации пользователей с именем пользователя staff:Username123

Я также пытался сделать поле имени пользователя не уникальным, но решил, что это плохая идея, поскольку django предупреждает об этом.

Есть ли у кого-нибудь рекомендации о том, как сохранить и запросить префиксное значение, которое зависит от флага is_staff?

1 Ответ

0 голосов
/ 06 сентября 2018

Создайте свойство в модели, которое отображает необходимое вам значение на основе значения is_staff:

@property
def namespace(self):
   return '%s:%s' % ('staff' if is self.is_staff else 'customer', self.username)

Я бы не стал сохранять namespace в базе данных, потому что вы должны сохранить значение, если что-то изменится. например пользователь больше не является персоналом или другими изменениями при создании пространства имен.

В вашем коде просто обратитесь к user.namespace

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