Подтвердить что ты не робот

Лучший способ добавить удобные методы в модель пользователя Django Auth?

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

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

4b9b3361

Ответ 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().

Ответ 5

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