7

在 django 中,创建用户与通常的模型实例创建具有不同且独特的流程。您需要调用create_user()which 是BaseUserManager.

由于 django REST 框架的流程是 do restore_object()and then save_object(),因此不可能ModelSerializer在通用创建 API 端点中使用 a 简单地创建用户,而无需破解。

什么是解决这个问题的干净方法?或者至少使用 django 的内置管道让它工作?

编辑:

需要注意的是,特别不起作用的是,一旦您尝试使用它对创建的用户实例进行身份验证,django.contrib.auth.authenticate如果该实例只是使用User.objects.create()而不是创建的,它就会失败.create_user()

4

4 回答 4

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

感谢大家的帮助!

于 2013-11-18T15:43:25.947 回答
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为with obj(最后一行2处)。

于 2014-09-19T15:20:22.560 回答
0

我正在与 DRF 合作。以下是我创建用户的方式:

我有一个带有覆盖保存方法的序列化器:

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)
于 2013-11-05T09:48:10.430 回答
0

似乎您应该restore_object()在序列化程序中覆盖,而不是save(). 这将允许您正确创建对象。

但是,看起来您正在尝试滥用该框架——您正在尝试create()创建一个单独的两个对象(用户和配置文件)。我不是 DRF 专家,但我怀疑这可能会导致一些问题。

您可能会通过使用自定义用户模型(它也将在同一对象中包含配置文件)做得更好。

于 2013-11-06T15:10:28.717 回答