1

DjangoとDRFの新機能ですが、DRFのシリアライザを使用して、デフォルトのユーザ登録動作を上書きしようとしています。
(ジョセル=ユーザ登録/ログイン/パスワードのためのDRF libには、などをリセット)Django RESTフレームワークシリアライザの出力

私はdjosersを閲覧しました、ユーザーを作成するために、シリアライザを使用する
def perform_create(self, serializer): user = serializer.save()

私の考えは、このメソッドをオーバーライドすることでしたオブジェクト以下を達成するためのシリアライザ:

  1. 並列
  2. LOにアカウントオブジェクトを作成し、ユーザー
  3. を作成私は、シリアライザで、このようなカスタム動作を達成する方法がわからないので、ジンユーザー

つの応答に認証トークンと一緒にアカウントオブジェクトを返す最後のポイントは私に迷惑を与えます。私は入力フィールドを読み取り専用にしていたので、私の応答には含まれていません。 saveメソッドでは、ユーザー+アカウントオブジェクトを作成し、ユーザーにログインしてから(ビューで必要な)ユーザーを返します。
作成したトークン文字列を含むアカウントオブジェクトを1つの応答にシリアル化するにはどうすればよいですか?

これは私のシリアライザ(簡素化し、ストリップいくつかのものから、それは基本的にはこれだけです)

class UserRegistrationSerializer(serializers.Serializer): 
email = serializers.EmailField(write_only=True) 
# some other fields 
password = serializers.CharField(style={'input_type': 'password'}, 
           write_only=True, 
           validators=settings.get('PASSWORD_VALIDATORS') 
           ) 
# this should be the output 
account = Account(read_only=True) 

def save(self): 
    user = User(email=self.validated_data['email']) 
    user.set_password(self.validated_data['password']) 
    user.save() 

    account = Account(user=user) 
    token = #logging in my user 

    return user 

答えて

1

使用このです:

class UserRegistrationSerializer(serializers.ModelSerializer): 
    email = serializers.EmailField(write_only=True) 
    # some other fields 
    password = serializers.CharField(
           style={'input_type': 'password'}, 
           write_only=True, 
           validators=settings.get('PASSWORD_VALIDATORS') 
           ) 
    # make sure you have related_name='account' in your one to one field 
    account = AccountSerializer(read_only=True) 
    # the token field 
    auth_token = TokenSerializer(read_only=True) 

    class Meta: 
     model = User 
     # define fields based on your needs 
     fields = ... 

    def create(self, validated_data): 
     user = User(email=self.validated_data['email']) 
     user.set_password(self.validated_data['password']) 
     user.save() 
     # create account 
     account = Account(user=user) 
     # create token for user 
     token = Token.objects.update_or_create(user=user) 
     return user 

あなたにも基づいてupdateメソッドを作成する必要がありますあなたのカスタムニーズ。

+0

甘い、そのトリックでした!ただし、これは、ユーザーモデルにアカウントモデルとトークンモデルの両方の参照があるためにのみ機能します。将来的には、応答に無関係な完全なユーザーをどのようにシリアル化するのでしょうか? – JimmyVanBraun

+0

@ JimmyVanBraunでは、メソッドフィールドを使用できます。 http://www.django-rest-framework.org/api-guide/fields/#serializermethodfieldをチェックしてください –

関連する問題