Лучший способ добавить удобные методы в модель Django Auth User? - PullRequest
22 голосов
/ 30 ноября 2009

Я хочу добавить метод удобства / модели к модели django.contrib.auth.models.User. Как лучше всего это делать, поскольку, когда я последний раз проверял, расширение модели User считалось плохой практикой.

У меня есть отдельная пользовательская UserProfile модель. Должен ли я использовать это для всех удобных для пользователя методов?

Ответы [ 5 ]

29 голосов
/ 30 ноября 2009

Это зависит от того, что вы пытаетесь добавить в модель. Если вы хотите добавить больше информации о пользователе, то обычно рекомендуется использовать метод 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 и выше)

14 голосов
/ 10 июля 2014

если вы хотите добавить пользовательские методы в модель 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)

и импортируйте его в файл __init__.py приложения. т.е. ::

#app/__init__.py
import monkey_patching
4 голосов
/ 30 ноября 2009

Да. Нет необходимости связываться с основами, когда к вашей пользовательской модели присоединена функция .get_profile ().

3 голосов
/ 17 января 2013

2013 обновление:

в 1.5 вы можете установить пользовательскую модель пользователя и добавить все, что хотите https://docs.djangoproject.com/en/dev/topics/auth/customizing/#auth-custom-user

0 голосов
/ 30 ноября 2009

Я предпочитаю использовать один и тот же UserProfile в различных проектах, которые я разрабатываю, и расширять User для любых нужд проекта. Таким образом, общая функциональность переходит к UserProfile, а специфичная для проекта функциональность - к пользовательскому пользователю. У меня еще не было побочных эффектов от использования подклассовой модели User. Интересно, есть ли еще какие-либо модели с Django 1.0+.

...