当前位置:  开发笔记 > 编程语言 > 正文

字段名称`username`对于模型无效

如何解决《字段名称`username`对于模型无效》经验,为你挑选了1个好方法。

我试图使用rest-auth提供的序列化器来定义端点/rest-auth/user /的GET(*with headers)用户详细信息

(*with headers(Content-Type:application/json授权:Token 1a5472b2af03fc0e9de31fc0fc6dd81583087523))

我得到以下回溯:https://dpaste.de/oYay#L

我已经定义了自定义用户模型(使用电子邮件而不是用户名):

class UserManager(BaseUserManager):
def create_user(self, email, password, **kwargs):
    user = self.model(
        # lower-cases the host name of the email address
        # (everything right of the @) to avoid case clashes
        email=self.normalize_email(email),
        is_active=True,
        **kwargs
    )
    user.set_password(password)
    user.save(using=self._db)
    return user

def create_superuser(self, email, password, **kwargs):
    user = self.model(
        email=email,
        is_staff=True,
        is_superuser=True,
        is_active=True,
        **kwargs
    )
    user.set_password(password)
    user.save(using=self._db)
    return user


class MyUser(AbstractBaseUser, PermissionsMixin):
    USERNAME_FIELD = 'email'

    email = models.EmailField(unique=True)

设置如下:

AUTH_USER_MODEL = 'users.MyUser'
ACCOUNT_USER_MODEL_USERNAME_FIELD = None
# Config to make the registration email only
ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_UNIQUE_EMAIL = True
ACCOUNT_EMAIL_VERIFICATION = 'optional'
ACCOUNT_USERNAME_REQUIRED = False
ACCOUNT_AUTHENTICATION_METHOD = 'email'
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'

不确定如何纠正此错误..以便它符合rest-auth序列化程序.



1> Geo Jacob..:

在django-rest-auth中,他们有一个默认的用户模型的默认序列化程序

即.

USER_DETAILS_SERIALIZER = 'rest_auth.views.UserDetailsView' 

在这里,他们正在序列化 djang.contrib.auth.User

在您的情况下,您使用的是自定义用户模型,并且模型中没有usernam字段,因此在尝试序列化字段用户名时出错.因此,您必须为User模型编写序列化程序并添加路径到您的设置:

例如:

class CustomUserDetailsSerializer(serializers.ModelSerializer):

    class Meta:
        model = MyUser
        fields = ('email',)
        read_only_fields = ('email',)

在settings.py中

USER_DETAILS_SERIALIZER = CustomUserDetailsSerializer 


该解决方案为我工作得很好,只是一个细节,以提高供将来参考答案:settings.py中使用的代码如下:`REST_AUTH_SERIALIZERS = {"USER_DETAILS_SERIALIZER":"users.serializers.CustomUserDetailsS​​erializer"}`
推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有