Лучший способ добавить удобные методы в модель пользователя Django Auth?
Я хочу добавить метод удобства/модели в модель django.contrib.auth.models.User
. Какова наилучшая практика для этого, поскольку в прошлый раз, когда я проверял, расширение модели User считалось плохим.
У меня есть отдельная пользовательская модель UserProfile
. Должен ли я использовать это для всех удобных для пользователя методов?
Ответы
Ответ 1
Это зависит от того, что вы пытаетесь добавить к модели. Если вы хотите добавить дополнительную информацию о пользователе, то обычно рекомендуется использовать метод UserProfile
: http://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users
Однако, если вы просто хотите добавить пользовательские методы или менеджеров в модель User
, я бы сказал, что более логично использовать прокси-модель, например:
from django.contrib.auth.models import User
class UserMethods(User):
def custom_method(self):
pass
class Meta:
proxy=True
Прокси-модель будет работать в той же таблице базы данных, что и исходная модель, поэтому идеально подходит для создания пользовательских методов без физического расширения модели. Просто замените любые ссылки на User
в ваших представлениях на UserMethods
. (И, конечно, вы можете использовать это в инструменте администратора, отменив регистрацию модели User
и зарегистрировав вместо нее свою прокси-модель.)
Любые экземпляры исходной модели User
, которые создаются, будут мгновенно доступны через модель UserMethods
и наоборот. Подробнее здесь: http://docs.djangoproject.com/en/dev/topics/db/models/#proxy-models
(NB. Прокси-модели требуют Django 1.1 и выше)
Ответ 2
если вы хотите добавить пользовательские методы в модель User, я бы рекомендовал monkey_patching:
создайте файл monkey_patching.py
в любом из apps
::
#app/monkey_patching.py
from django.contrib.auth.models import User
def get_user_name(self):
if self.first_name or self.last_name:
return self.first_name + " " + self.last_name
return self.username
User.add_to_class("get_user_name",get_user_name)
и импортировать его в файл app __init__.py
. то есть::
#app/__init__.py
import monkey_patching
Ответ 3
Да. Не нужно связываться с основами, когда ваша пользовательская модель имеет прикрепленную к ней функцию .get_profile().
Ответ 4
2013 обновление:
в 1.5 вы можете настроить пользовательскую модель пользователя и добавить все, что хотите https://docs.djangoproject.com/en/dev/topics/auth/customizing/#auth-custom-user
Ответ 5
Я предпочитаю использовать один и тот же UserProfile для различных проектов, которые я разрабатываю и расширяю User для любых потребностей, связанных с конкретным проектом. Таким образом, общая функциональность распространяется на UserProfile, а функциональность, специфичная для проекта, распространяется на пользовательский пользователь. У меня не было каких-либо неблагоприятных последствий наличия подкласса User model, тем не менее, интересно, есть ли еще с Django 1.0 +.