Наследование и расширение пользовательской модели в Django

#django #django-models

#django #django-модели

Вопрос:

Я хочу наследовать класс UserProfile от встроенного класса User с 2 модификациями:

1) поле имени пользователя не должно быть уникальным

2) Поле электронной почты должно быть уникальным

Итак, как переопределить эти 2 поля классом UserProfile?

Насколько я понимаю, я не могу изменить класс User, поэтому я должен каким-то образом внести эти изменения в class UserProfile… Но как это сделать??? Помогите мне, пожалуйста!

Заранее спасибо!!!!

Ответ №1:

Я думаю, вам нужно просто обезьянить патч.

Я никогда не делал этого сам, но было весело копаться в этом. Проверьте функцию инициализации поля модели (куда нам нужно будет передать unique=True )

 def __init__(self, verbose_name=None, name=None, primary_key=False,
        max_length=None, unique=False, blank=False, null=False,
        db_index=False, rel=None, default=NOT_PROVIDED, editable=True,
        serialize=True, unique_for_date=None, unique_for_month=None,
        unique_for_year=None, choices=None, help_text='', db_column=None,
        db_tablespace=None, auto_created=False, validators=[],
        error_messages=None):
    self.name = name
    self.verbose_name = verbose_name
    self.primary_key = primary_key
    self.max_length, self._unique = max_length, unique
 

Кажется, все, что его волнует, это то, что атрибут _unique имеет значение True или False. Остальная часть django magic не должна заботиться о том, как был установлен этот атрибут, так что давайте исправим обезьяну!

Поместите приложение monkey patch где-нибудь в свой INSTALLED_APPS и поместите его в свой models.py (который загружается автоматически):

 from django.contrib.auth.models import User
User._meta.get_field("username")._unique = False
User._meta.get_field("email")._unique = True
 

Конечно же, django генерирует следующий SQL:

 CREATE TABLE "auth_user" (
    "id" integer NOT NULL PRIMARY KEY,
    "username" varchar(30) NOT NULL,
    "first_name" varchar(30) NOT NULL,
    "last_name" varchar(30) NOT NULL,
    "email" varchar(75) NOT NULL UNIQUE,
    "password" varchar(128) NOT NULL,
    "is_staff" bool NOT NULL,
    "is_active" bool NOT NULL,
    "is_superuser" bool NOT NULL,
    "last_login" datetime NOT NULL,
    "date_joined" datetime NOT NULL
)