用户模型继承和扩展Django

时间:2011-10-30 18:30:04

标签: django django-models

我想从内置类User继承UserProfile类,并进行2次修改:

1)用户名字段必须不唯一

2)电子邮件字段必须是唯一的

那么,如何通过UserProfile类覆盖这两个字段?

据我所知,我无法更改类User,所以我必须以某种方式在UserProfile类中进行此更改... 但是怎么做??? 请帮帮我!

提前致谢!!!!

1 个答案:

答案 0 :(得分:1)

我认为你应该只是补丁。

我自己从来没有这样做过,但很有趣。查看模型字段init函数(我们需要传递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是真还是假。 django魔法的其余部分不应该关心该属性是如何设置的,所以让我们看看猴子补丁!

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
)