如何通过创建自定义模型覆盖 Django 中用户名的最大长度

How to override max length of username in Django by creating a custom model

我有问题。我正在使用 Django 1.7,并且已经制作了一个自定义用户模型,它继承了 Django 的抽象用户,如下所示:

class CustomUser(AbstractUser, BaseModel):

现在他们在这里 Django-ticket 说,我可以通过创建自定义用户来避免用户名 max_length 为 30 的问题。好吧,我已经有一个自定义用户,所以应该很容易吧?我是如何尝试这样做的:

class CustomUser(AbstractUser, BaseModel):

      username = models.CharField(max_length=70, unique=True, db_index=True)

现在,当我尝试为更改此字段进行迁移时,会导致错误:django.core.exceptions.FieldError: Local field 'username' in class 'CustomUser' clashes with field of similar name from base class 'AbstractUser'

我做错了什么?我该如何解决这个问题?我有需要迁移的数据,所以我不能清空数据库。

如果您希望它更灵活地继承自 AbstractBaseUser,您将能够以这种方式指定您自己的用户名字段,例如

class User(AbstractBaseUser):
    email = models.EmailField(
        verbose_name='email address',
        max_length=255,
        unique=True,
    )

    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)

    date_joined = models.DateTimeField(
        verbose_name=_('date created'),
        auto_created=True,
        default=timezone.now
    )

    objects = UserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

https://docs.djangoproject.com/en/1.7/topics/auth/customizing/#specifying-a-custom-user-model

不要尝试覆盖 username 字段。刚刚

class CustomUser(AbstractUser, BaseModel):

       #here goes other fields

CustomUser._meta.get_field('username').max_length = 70 

但我强烈建议改用 inherit from AbstractBaseUser

据我了解,您不能覆盖任何 Django ORM 模型的属性,也不能来自 AbstractUser,也不能来自 PermissionsMixin classes。所以,如果你有自己的权限、组(角色)方法,即使你想要另一个属性名称而不是 user_permissionsgroups,那么你应该从 AbstractBaseUser 继承,做很多事情从 AbstractUser 复制粘贴并从 django.db.models.Model class 继承你的 PermissionGroup 模型作为 @levi@Hedde van der Heide 建议。