如何使用DRF的ModelSerializer创建一个django用户
在Django中,创建一个User有与通常的Model实例创建不同且独特的流程。 你需要调用create_user()
这是BaseUserManager
一个方法。
由于django REST框架的流程是执行restore_object()
,然后执行save_object()
,因此不可能在通用的create API端点中简单地使用ModelSerializer
创建用户,而不会破解你的方法。
什么将是一个干净的方式来解决这个问题? 或者至少让它使用django的内置管道工作?
编辑:
重要的是要注意,特别不起作用的是,一旦你尝试使用django.contrib.auth.authenticate
验证创建的用户实例,如果实例仅仅是使用User.objects.create()
而不是.create_user()
创建的,则它会失败。
最终我重写了序列化器的restore_object
方法,并确保发送的密码是使用instance.set_password(password)
,如下所示:
def restore_object(self, attrs, instance=None):
if not instance:
instance = super(RegisterationSerializer, self).restore_object(attrs, instance)
instance.set_password(attrs.get('password'))
return instance
感谢大家的帮助!
解决这个问题的另一种方法是在pre_save(self, obj)
的扩展中覆盖pre_save(self, obj)
方法, viewsets.GenericViewSet
所示:
def pre_save(self, obj):
""" We have to encode the password in the user object that will be
saved before saving it.
"""
viewsets.GenericViewSet.pre_save(self, obj)
# Password is raw right now, so set it properly (encoded password will
# overwrite the raw one then).
obj.user.set_password(obj.user.password)
编辑:
请注意,上面代码中的obj包含User类的实例。 如果直接使用Django的用户模型类, obj.user
用代码中的obj
替换obj.user
(最后一行放在两处)。
我正在与DRF合作。 这里是我如何创建用户:
我有一个Serializer with overrided save方法:
def save(self, **kwargs ):
try:
user = create_new_user(self.init_data)
except UserDataValidationError as e:
raise FormValidationFailed(e.form)
self.object = user.user_profile
return self.object
create_new_user只是我创建用户的函数,在视图中,我只有:
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
链接地址: http://www.djcxy.com/p/17031.html
上一篇: How to create a django User using DRF's ModelSerializer
下一篇: PostgreSQL: Terribly slow ORDER BY with primary key as the ordering key