簡體   English   中英

使用Djoser和Django Rest Framework注冊用戶時傳遞其他數據

[英]Pass additional data while registering user using Djoser and 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

這里, 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', ]

這就是它在djoser文檔頁面上所說的內容:

使用此端點注冊新用戶。 您的用戶模型管理器應實現create_user方法並具有USERNAME_FIELD和REQUIRED_FIELDS字段。

但是,在我的情況下,referrer_code不是正在注冊的用戶的字段,它是引用新用戶的用戶的字段。 所以我不認為包括referral_code作為必填字段會有所幫助。

可能會或可能沒有幫助,這是舊的,但它仍然沒有答案,所以這里。

遇到類似的問題,我使用自定義用戶模型(擴展AbstractBaseUser),盡管我在序列化程序上做了任何事情,但DRF只會顯示默認字段 - 我認為名稱,電子郵件和密碼。

我已經瀏覽了文檔並完成了所有指定的操作,包括在settings.py指定序列化程序,就像在docs中的示例一樣: 'user': 'myapp.serializers.SpecialUserSerializer' ,但仍然沒有骰子。

事實證明,每個端點都需要一個串行器。 我希望您定義一個User序列化程序,注冊終端會從中獲取。 相反,您需要一個user_registration端點, 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',
}

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

DJOSER = {
    'SERIALIZERS': {
        'user_registration': 'account.serializers.UserSerializer',
    },
}

終點http://127.0.0.1:8000/auth/register/現在顯示我想要的字段。 希望能幫助別人!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM