如何在 Django 自定义用户模型中将用户名字段更改为 user_name?

How to change the field of username to user_name in to django custom user model?

我已经创建了自定义用户模型。现在我想使用 user_name 作为用户名字段而不是 username。如下面的代码片段所示。

class CustomUser(AbstractBaseUser):
    
    username_validator = UnicodeUsernameValidator()

    user_name = models.CharField(
        _('username'),
        max_length=100,
        unique=True,
        help_text=_('Required. 100 characters or fewer. Letters, digits and @/./+/-/_ only.'),
        validators=[username_validator],
        error_messages={
            'unique': _("A user with that username already exists."),
        },
    )
    USERNAME_FIELD = 'user_name'

我做不到。我遇到以下错误:

SystemCheckError: System check identified some issues:
ERRORS:
<class 'accounts.admin.CustomUserAdmin'>: (admin.E033) The value of 'ordering[0]' refers to 'username', which is not an attribute of 'accounts.CustomUser'.
<class 'accounts.admin.CustomUserAdmin'>: (admin.E108) The value of 'list_display[0]' refers to 'username', which is not a callable, an attribute of 'CustomUserAdmin', or an attribute or method on 'accounts.CustomUser'

之所以使用这个,是因为所有项目的数据库table的约定都是这样的。如果我可以定义字段名称是数据库,就像我们在 Meta class 中为 tables 所做的那样,那就更好了,如下所示。我将我的自定义用户模型称为数据库中的用户模型。

class Meta:
        db_table = "user"

是否可以像这样调用 table 字段?

class Meta:
            db_table_user_name = "username"

如果可能的话,我们不需要将 username 更改为 user_name。我们可以直接调用数据库中的用户名字段等于user_name。当且仅当 Django 模型可行时。

在 admin.py 中您注册用户模型的位置。您正在使用 ModelAdmin 注册它,并且在该 ModelAdmion 中您错误地命名了字段。将其更改为 user_name 他们也是。

在您的情况下,您不需要更改字段名称,只需使用 db_column='user_name' 参数和参数覆盖 username 字段即可:

class CustomUser(AbstractBaseUser):
    username_validator = UnicodeUsernameValidator()

    username = models.CharField(
        _('username'),
        max_length=150,
        unique=True,
        help_text=_('Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.'),
        db_column='user_name'  # <------------------------
        validators=[username_validator],
        error_messages={
            'unique': _("A user with that username already exists."),
        },
    )

Django doc refrence