2012-05-10 9 views
2

私はTastyPieの基本を理解していますが、カスタムModelResourceメソッドは私にとって非常に混乱しています。私は、ユーザのパスワードを更新するためにPATCH APIコールを作成しようとしており、データはset_password()メソッドを実行していないため、データベースのハッシュ値ではなく生の値で更新されています。ここに私のModelResourceは次のとおりです。TastyPie Patchを使ってパスワードを更新する方法

class UserResource(ModelResource): 
    class Meta: 
     queryset = User.objects.all() 
     resource_name = 'user' 
     excludes = ['is_active', 'is_staff', 'is_superuser'] 
     authorization = Authorization() 
     detail_allowed_methods = ['get', 'post', 'put', 'delete', 'patch'] 
     filtering = { 
      'username': ALL, 
     } 
     authentication = ApiKeyAuthentication() 

私はここにobj_updateメソッドを使用する必要があると仮定すると、実際のオブジェクトは、ユーザーテーブルに更新される前にset_password方法でパスワードを実行するには、この書式を設定するかどうかはわからないのです。

答えて

4

すべてのケース(POST、PUT、PATCH)でこのraw_passwordからハッシュへの変換を処理するには、hydrateメソッドを使用する必要があります。私は個人的にTastypieあなたはPOSTすることができますので、/ PUT/PATCHは、あなたが(良い習慣というの横)GET要求から受け取ることをバックオブジェクト、名前空間の衝突を起こさないように仮想フィールドraw_passwordを定義します。

def hydrate(self, bundle): 
    if bundle.data.has_key('raw_password'): 
     u = User(username='dummy') 
     u.set_password(bundle.data['raw_password']) 
     bundle.data['password'] = u.password 
    return bundle 
+0

digivampireおかげで@このため。私はここの正しい方向に向かっているように感じる。いくつかのフォローアップの質問:「仮想フィールドの定義」について詳しく説明してください。どこで実行され、どのように構成されていますか?また、 'username =' dummy 'のポイントは何ですか?また、束に入っているものを見るためにハイドレートメソッドをデバッグする方法はありますか? – bevinlorenzo

+0

この時点では、バンドルには、シリアルシリアル化されたデータのみが含まれています。このデータから、Tastypieは完全なモデルオブジェクトを作成します。仮想フィールドでは、シリアル化された入力から読み込まれたエントリを意味しますが、実際のTastyPieやDjangoのORMフィールドではありません。単純にパスワードハッシュを計算し、クライアントが実際にハッシュを知っているかのように配置し、 'password = hash_of(raw_password)'で要求にそれを投入するだけです。 Userオブジェクトをインスタンス化するときにusernameを指定する必要があるかどうかはわかりませんでした。あなたはそうする必要はありませんので、無視してください:)。 – astevanovic

+0

これはうまくいった!本当にありがとう! – bevinlorenzo

関連する問題