2017-06-06 59 views
0

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/。我可以根據預定義的約束來驗證請求體中的passwordemail字段(例如,密碼不能完全是數字)。爲此,我重寫字段驗證程序,如validate_passwordvalidate_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用戶模型。

謝謝!

回答

0

這個問題,你所得到的數據直客原料後,當你應該使用串行

password = request.data.get('password',None) 
    new_password = request.data.get('new_password',None) 

現在假設與驗證代碼的串行被稱爲MySerializer,上面的紋路需要替換爲類似的東西

serial = MySerializer(data=request.data) 
    if serial.is_valid(): 
     password = serial.validated_data['password'] 
     new_password = serial.validated_data['new_password'] 

現在您的驗證代碼將被執行。

+0

謝謝!說得通。但是當我這樣做時,由於諸如電子郵件之類的必需字段,我在串行器驗證中失敗。電子郵件是創建用戶的必填字段,但在更新密碼時不需要。我該如何克服這一點? – hnroot

+1

不要害怕製作多個序列化器。很多新手都犯了這個錯誤。爲密碼字段創建一個新的序列化程序。 – e4c5