DRF新手在這裏。我有以下型號:DRF:串行器驗證,同時提交詳細路線的POST請求
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
字段(例如,密碼不能完全是數字)。爲此,我重寫字段驗證程序,如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
有一個完全數字的。
我意識到我可以嘗試在細節路線實現中實現validate_password
這一事實,但它不覺得是最好的方法。
我的問題是什麼是最好的方式來做到這一點沒有重複的代碼,並沒有移動驗證邏輯到views.py?
PS:由於各種原因,我不能使用也不能擴展Django用戶模型。
謝謝!
謝謝!說得通。但是當我這樣做時,由於諸如電子郵件之類的必需字段,我在串行器驗證中失敗。電子郵件是創建用戶的必填字段,但在更新密碼時不需要。我該如何克服這一點? – hnroot
不要害怕製作多個序列化器。很多新手都犯了這個錯誤。爲密碼字段創建一個新的序列化程序。 – e4c5