在使用Djoser和Django Rest Framework注册用户时传递附加数据 [英] Pass additional data while registering user using Djoser and Django Rest Framework
问题描述
我正在使用Djoser( https://github.com/sunscrapers/djoser )以及Django休息框架我使用Djoser提供的默认/注册/端点。现在,我想在注册用户时传递其他信息。比如说推荐代码(以查看用户来自哪里)。我想我需要在我的UserManager类的create_user方法中实现这个逻辑。
I'm using Djoser(https://github.com/sunscrapers/djoser) along with Django Rest Framework. I'm using the default /register/ endpoint provided by Djoser. Now, I want to pass additional information at the time of registering a user. Say for example the referral code (to see where the user came from). I think I need to implement this logic in create_user method of my UserManager class.
这是MyUserManager:
Here is my 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请求的一部分传递的。
Here, referrer_code
is what I want to pass as a part of the POST request.
这是MyUser模型:
Here is my MyUser model:
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文档页面上所说的: / p>
This is what it says on the djoser documentation page:
使用此端点注册新用户。您的用户模型管理器应该
实现create_user方法,并具有USERNAME_FIELD和
REQUIRED_FIELDS字段。
Use this endpoint to register new user. Your user model manager should implement create_user method and have USERNAME_FIELD and REQUIRED_FIELDS fields.
然而,在我的情况下,referrer_code不是正在注册的用户的字段,它是引用新的用户的字段。所以我不认为将referral_code作为必填字段会有所帮助。
However, in my case, referrer_code is not a field of the user that is being registered, it is a field of the user who referred the new one. So I don't think including referral_code as a required field would help.
推荐答案
可能或可能没有帮助,这是旧的,但仍然没有答案,所以这里。
May or may not be helpful and this is old, but it's still unanswered so here goes.
在我使用自定义用户模型(扩展AbstractBaseUser)的类似问题中,尽管我在序列化器上做了任何事情,但DRF只会显示默认字段 - 我认为名字,电子邮件和密码。
Came across a similar issue where I was using a custom User model (extending AbstractBaseUser), and despite anything I did on the serializer, the DRF would only show the default fields - I think name, email, and password.
我已经浏览了文档并完成了所有指定,包括在 settings.py
中指定序列化程序,因为它们在文档中的示例中:
'user':'myapp.serializers.SpecialUserSerializer'
,但仍然没有骰子。
I'd gone through the docs and done everything specified, including specifying the serializer in settings.py
as they do in the example in the docs:
'user': 'myapp.serializers.SpecialUserSerializer'
, but still no dice.
事实证明,每个端点都需要一个串行化程序。我预计您将定义一个用户
序列化程序,并且注册端点将从中获取。相反,您需要一个 user_registration
端点,仅定义注册所需的东西。这些都是默认值,每个都是必须覆盖的:
Turns out that you need a serializer for each endpoint. I'd expected that you'd define a User
serializer, and the registration endpoint would grab from that. Instead, you need a user_registration
endpoint that defines just the stuff necessary for registration. These are all the defaults, each of which you'd have to override as applicable:
{
'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
中:
So in my case, I put this in settings.py
:
DJOSER = {
'SERIALIZERS': {
'user_registration': 'account.serializers.UserSerializer',
},
}
和endpoing http://127.0.0.1:8000/auth/register/
现在显示我想要的字段。希望能帮助别人!
and the endpoing http://127.0.0.1:8000/auth/register/
is now showing the fields I wanted it to. Hope that helps someone else!
这篇关于在使用Djoser和Django Rest Framework注册用户时传递附加数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!