Рефакторинг пользовательской модели пользователя для пользователя UserProfile: нужно ли создавать пользовательский UserManager или добавлять user.get_profile () десятки раз? - PullRequest
0 голосов
/ 31 марта 2010

Я проводил рефакторинг приложения, которое настроило стандартную модель User из django.contrib.auth.models, создав UserProfile и определив его с помощью AUTH_PROFILE_MODULE.

Проблема в том, что атрибуты в UserProfile используются по всему проекту для определения того, что видит пользователь.

Я неоднократно создавал тесты и вставлял операторы такого типа:

user = User.objects.get(pk=1)
user_profile = user.get_profile()

if user_profile.karma > 10:
    do_some_stuff()

Это утомительно, и теперь мне интересно, нарушаю ли я принцип СУХОГО.

Будет ли разумнее создать пользовательский UserManager, который автоматически загружает данные UserProfile при запросе пользователя.

Я мог бы даже перебрать атрибуты UserProfile и добавить их в модель User. Это избавило бы меня от необходимости обновлять все ссылки на пользовательские атрибуты модели, которые засоряют код.

Конечно, я должен был бы вернуться к процессу, чтобы разрешить корректное обновление моделей User и UserProfile.

Какой подход больше для Джанго?

1 Ответ

1 голос
/ 31 марта 2010

Лично я не беспокоюсь о помощнике get_profile(). Я просто использую однозначное поле для User в своем профиле пользователя и устанавливаю related_name='projname_profile'.

Затем вы можете использовать магию ORM, чтобы получить все в одном запросе (с предостережением, которое, я думаю, select_related выбирает только реверс 1-1 в Django 1.2 и далее, но, возможно, оно было перенесено ...):

user = User.objects.select_related().get(pk=1)
profile = user.projname_profile   # or just call it inline
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...