DRF:在向详细路由

时间:2017-06-06 11:33:32

标签: python django validation django-rest-framework

DRF新手在这里。我有以下型号:

class User(models.Model):

    first_name = models.CharField(max_length=30, null=True, blank=True)
    last_name = models.CharField(max_length=30, null=True, blank=True)

    email = models.EmailField(max_length=254, null=False, blank=False, unique=True)
    password = models.CharField(max_length=128, null=False, blank=False)

我成功地成功实施了POST /users/。我能够根据预定义的约束验证请求正文中的passwordemail字段。(例如,密码不能完全是数字)为此,我覆盖了字段验证器,例如{{ 1}}和validate_password

现在,我正在尝试实施端点validate_email,用户可以通过该端点更新其POST /users/pk/password/资源。为实现这一目标,我使用了password。您可以在下面找到相应的实现:

detail_route

通过使用此方法,我可以更新用户的# Custom method to update the password resource of a given user. @detail_route(methods=['post']) def password(self, request, pk=None): try: user = User.objects.get(pk=pk) except User.DoesNotExist: # returns error else: password = request.data.get('password',None) new_password = request.data.get('new_password',None) if password and new_password: if check_password(password,user.password): # Use Django built-in to hash password. password_hash = make_password(new_password) user.password = password_hash user.save() serializer_data = UserSerializer(user).data return Response(serializer_data) else: # return error reponse else: # return error response 字段,但password在调用validate_password时无效,以便用户可以更新他们的POST /users/pk/password/完全数字化。

我意识到我可以尝试在详细路由实现中实现password,但这并不是最好的方法。

我的问题是,如果不重复代码并且不将验证逻辑移入views.py,最好的方法是什么?

PS:由于各种原因,我无法使用或扩展Django用户模型。

谢谢!

1 个答案:

答案 0 :(得分:1)

问题是,当您应该使用序列化程序时,您将直接从原始帖子获取数据

$_POST['data']

现在假设带有验证码的序列化程序名为 password = request.data.get('password',None) new_password = request.data.get('new_password',None) ,上述行需要替换为

MySerializer

现在您的验证码将被执行。