#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
)