在django中,创建用户具有与通常的模型实例创建不同且唯一的流程。您需要拨打create_user()
这是BaseUserManager
的方法。
由于django REST框架的流程是restore_object()
然后是save_object()
,因此无法在通用创建API端点中使用ModelSerializer
创建用户,而无需通过
解决这个问题的干净方法是什么?或者至少让它使用django的内置滚边工作?
修改
重要的是要注意,特别是不起作用的是,一旦您尝试使用django.contrib.auth.authenticate
对创建的用户实例进行身份验证,如果仅使用User.objects.create()
而非.create_user()
创建实例,则会失败。
答案 0 :(得分:2)
最终我覆盖了序列化程序的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
谢谢大家的帮助!
答案 1 :(得分:1)
解决此问题的另一种方法是覆盖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
(2个位置的最后一行)。
答案 2 :(得分:0)
我正在与DRF合作。以下是我创建用户的方式:
我有一个带有覆盖保存方法的Serializer:
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)
答案 3 :(得分:0)
您似乎应该在序列化程序中覆盖restore_object()
,而不是save()
。这将允许您正确创建对象。
然而,看起来你正试图滥用框架 - 你试图让一个create()
创建两个对象(用户和配置文件)。我不是DRF专家,但我怀疑这可能会引起一些问题。
使用自定义用户模型(在同一对象中也包含配置文件)可能会做得更好。