使用Djoser和Django Rest Framework注册用户时传递其他数据

rah*_*ulg 4 python django django-rest-framework

我正在使用Djoser(https://github.com/sunscrapers/djoser)和Django Rest Framework.我正在使用Djoser提供的默认/ register /端点.现在,我想在注册用户时传递更多信息.比如说推荐代码(看看用户来自哪里).我想我需要在UserManager类的create_user方法中实现这个逻辑.

这是我的MyUserManager:

class MyUserManager(BaseUserManager):
    def create_user(self, name, email, referrer_code="", password=None):
        """
        Creates and saves a User with the given email, date of
        birth and password.
        """
        if not email:
            raise ValueError('Users must have an email address')
        print "referrercode" + referrer_code
        referrer = 0
        if (referrer_code != ""):
            try:
                referrer = MyUser.objects.filter(referral_code=referrer_code).first().id
            except:
                referrer = 0
        user = self.model(
            name=name,
            email=self.normalize_email(email),
            referrer=referrer,
        )

        user.set_password(password)
        user.save(using=self._db)
        return user
Run Code Online (Sandbox Code Playgroud)

referrer_code是我想要作为POST请求的一部分传递的内容.

这是我的MyUser模型:

class MyUser(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)
    name = models.CharField(max_length=255, blank=True)
    referrer = models.IntegerField(default=0)
    referral_code = models.CharField(max_length=10, blank=True)

    objects = MyUserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['name', ]
Run Code Online (Sandbox Code Playgroud)

这就是它在djoser文档页面上所说的内容:

使用此端点注册新用户.您的用户模型管理器应实现create_user方法并具有USERNAME_FIELD和REQUIRED_FIELDS字段.

但是,在我的情况下,referrer_code不是正在注册的用户的字段,它是引用新用户的用户的字段.所以我不认为包括referral_code作为必填字段会有所帮助.

小智 8

可能会或可能没有帮助,这是旧的,但它仍然没有答案,所以这里.

遇到类似的问题,我使用自定义用户模型(扩展AbstractBaseUser),尽管我在序列化程序上做了任何事情,但DRF只会显示默认字段 - 我认为名称,电子邮件和密码.

我已经浏览了文档并完成了所有指定的操作,包括settings.py在文档中的示例中 指定序列化程序'user': 'myapp.serializers.SpecialUserSerializer',但仍然没有骰子.

事实证明,每个端点都需要一个串行器.我期望你定义一个User序列化器,注册端点会从中获取.相反,您需要一个user_registration只定义注册所需内容的端点.这些都是默认值,您必须在适用时覆盖每个默认值:

{
    'activation': 'djoser.serializers.ActivationSerializer',
    'login': 'djoser.serializers.LoginSerializer',
    'password_reset': 'djoser.serializers.PasswordResetSerializer',
    'password_reset_confirm':     'djoser.serializers.PasswordResetConfirmSerializer',
    'password_reset_confirm_retype': 'djoser.serializers.PasswordResetConfirmRetypeSerializer',
    'set_password': 'djoser.serializers.SetPasswordSerializer',
    'set_password_retype': 'djoser.serializers.SetPasswordRetypeSerializer',
    'set_username': 'djoser.serializers.SetUsernameSerializer',
    'set_username_retype': 'djoser.serializers.SetUsernameRetypeSerializer',
    'user_registration': 'djoser.serializers.UserRegistrationSerializer',
    'user': 'djoser.serializers.UserSerializer',
    'token': 'djoser.serializers.TokenSerializer',
}
Run Code Online (Sandbox Code Playgroud)

所以在我的情况下,我把它放在settings.py:

DJOSER = {
    'SERIALIZERS': {
        'user_registration': 'account.serializers.UserSerializer',
    },
}
Run Code Online (Sandbox Code Playgroud)

http://127.0.0.1:8000/auth/register/现在,endpoing 显示了我想要的字段.希望能帮助别人!