2

私はカスタムモデルを持っています - プロファイル、これはOneToOneリレーションシップとdjangoユーザオブジェクトを持ちます。DRFシリアライザユーザ作成のネストされたフィールド

class Profile(models.Model): 
    user = OneToOneField(User, on_delete=models.CASCADE) 
    profile_type = models.CharField() 

私は、ユーザーオブジェクトのネストされた属性の作成と検索の作成だけでなく、「profile_type」属性を可能Djangoの残りのフレームワークのシリアライザを作りたいです。

私は名前は単になど「ユーザ名」、「パスワード」、「電子メール」、などのPOSTリクエストで指定したい -

...、代わりに「profile_username」、「profile_password」の

ImproperlyConfigured: Field name 'profile_user_username' is not valid for model 'Profile' 

は私が間違ってネストされたフィールドの構文を取得しています:私はエラーを取得してきた - これまでのところ私は

class ProfileSerializer(serializers.ModelSerializer): 
    username = serializers.CharField(source='profile_user_username') 
    password = serializers.CharField(source='profile_user_password') 
    email = serializers.CharField(source='profile_user_email') 

    class Meta: 
     model = Profile 
     fields = ('id', 
        'profile_user_username', 'profile_user_password', 'profile_user_email', 
        'username', 
        'password', 
        'email') 
     depth = 2 

を持っていますが?それとも別のことですか?

+0

あなたは '' 'ソース= 'profile.user.username''''を試してみましたか? –

答えて

3

試してみてください。

class User(models.Model): 
    username = models.CharField() 
    password = models.CharField() 
    email = models.CharField() 

class UserSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = User 

class ProfileSerializer(serializers.ModelSerializer): 
    user = UserSerializer(many=True) 
    class Meta: 
     model = Profile 
     fields = ('user', 'profile_type',) 

    def create(self, validated_data): 
     user_data = validated_data.pop('user') 
     user = User.objects.create(**user_data) 
     profile = Profile.objects.create(user=user, **validated_data) 
     return profile 

と書き込み可能なネストされたシリアライザのための thisをチェックしてください。ネストされたオブジェクトを処理するための

: チェックアウトこのthis

+0

Hm、ダイスはありません。 profile_user.username – codepringle

+0

こんにちは@codepringleなど、他のバリエーションも試しました。あなたの質問を慎重に読んだ後。あなたが本当に望んでいるのは、書き込み可能なネストされたシリアライザです。私は自分の答えを編集しました。それがあなたの必要に合っているかどうかチェックすることができます。 –

+0

ねえ、これは私が必要としていたものでした。私はそれを含める答えを更新できる場合、私はそれを愛するだろう:カスタムUserSerializerを作成することに加えて、私はまた、ProfileSerializerのcreate(self、validated_data)メソッドをオーバーライドする必要があります。これにより、データにアクセスできるようになり、ORM内の適切な関係(つまり、ユーザーとそれがプロファイルに保存された関係)を保存することができました。いずれにせよありがとう! – codepringle

関連する問題