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/
。我能够根据预定义的约束验证请求正文中的password
和email
字段。(例如,密码不能完全是数字)为此,我覆盖了字段验证器,例如{{ 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用户模型。
谢谢!
答案 0 :(得分:1)
问题是,当您应该使用序列化程序时,您将直接从原始帖子获取数据
$_POST['data']
现在假设带有验证码的序列化程序名为 password = request.data.get('password',None)
new_password = request.data.get('new_password',None)
,上述行需要替换为
MySerializer
现在您的验证码将被执行。