2017-05-05 5 views
0

自分のプロファイルでdjango rest frameworkを通じてユーザ登録エンドポイントを作成しようとしています。シリアライザ用に明示的な.create()メソッドを作成していないことを示しています。 。私は何が欠けているのですか?書き込み可能なネストされたシリアライザユーザとユーザのプロファイルが機能しない

ここにあなたのコードはOKに見えますが、あなたのインデントが間違って見える

class ProfileCreateAPIView(CreateAPIView): 
    queryset = User.objects.all() 
    model = Profile 
    serializer_class = UserSerializer 
+0

これは実際にあなたのソースコードの字下げですか?完全なトレースバックを貼ってもらえますか? – Linovia

答えて

0

私のmodels.py

class Profile(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE, blank=True, null=True) 
    language = models.CharField(max_length=4, default='es') 

    def __unicode__(self): 
     return "%s - %s" % (self.user, self.language) 

私serializers.py

class ProfileCreateSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = Profile 
     fields = [ 
     'language', 
     ] 


class UserSerializer(serializers.ModelSerializer): 
    profile = ProfileCreateSerializer() 

    class Meta: 
     model = User 
     fields = [ 
     'username', 
     'profile', 
     ] 

def create (self, validated_data): 
    user = User.objects.create(username=validated_data['username']) 
    user.set_password(User.objects.make_random_password()) 
    profile_data = validated_data.pop('profile') 
    Profile.objects.create(user=user, **profile_data) 
    user.save() 

私のviews.pyです。 .create()メソッドは、シリアライザ上のメソッドである必要があります。したがって、シリアライザと同じレベルに字下げする必要がありますclass Meta:声明。

それはおそらく(create()法上のインデントに注意してください)、次のようになりますことができます場合はDRF Docs (Saving Instances)

class UserSerializer(serializers.ModelSerializer): 

    profile = ProfileCreateSerializer() 

    class Meta: 
     model = User 
     fields = [ 'username', 'profile', ] 

    def create (self, validated_data): 
     user = User.objects.create(username=validated_data['username']) 
     user.set_password(User.objects.make_random_password()) 
     profile_data = validated_data.pop('profile') 
     Profile.objects.create(user=user, **profile_data) 
     user.save() 

より多くの例、。

関連する問題