1

送信されたjsonデータをdjango-rest-frameworkによってdbに保存したいと思います。 問題は、関係を保存せずにエラーを返すことです。リレーションシップを持つmodelSerializerを保存する方法は? - django

怒鳴るスニペットは、私のモデルである:

class Profile(models.Model): 
    user = models.OneToOneField(settings.AUTH_USER_MODEL, related_name='profile', on_delete=models.CASCADE) 
    name = models.CharField(max_length=30) 
    family = models.CharField(max_length=50) 

class Klass(models.Model): 
    title = models.CharField(max_length=50) 
    description = models.CharField(max_length=500) 
    teacher = models.ForeignKey(Profile, related_name='teacher', on_delete=models.CASCADE) 

私はKlassモデルをデシリアライズ/シリアライズするためにシリアライザの下に使用します。

class ProfileSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Profile 
     fields = ('pk', 'name', 'family') 

class KlassSerializer(serializers.ModelSerializer): 
    teacher = ProfileSerializer()   

    class Meta: 
     model = Klass 
     fields = ('id', 'title', 'description', 'teacher') 

JSONオブジェクトを準備してビューに送信すると、エラーが返されます。以下のビュークラスである:

class KlassView(APIView): 
"""for SELECT, INSERT Queries""" 

    def get(self, request, pk): 
     # somthing 

    @csrf_exempt 
    def post(self,request, pk=None): 
     """For Creating A Class""" 
     serializer = KlassSerializer(data=request.data) 
     if serializer.is_valid(): 
      teacher = ProfileSerializer(request.data['teacher']['pk']) 
      serializer.teacher = teacher.data    
      serializer.save() 
      return Response({'data': serializer.data}) 
     else: 
      return Response({'data': serializer.errors}) 

とエラーがある:

.create()方法は、デフォルトで書き込み可能なネストされたフィールドをサポートしていません。 シリアライザmainp.serializers.KlassSerializerの明示的な.create()メソッドを記述するか、ネストされたシリアライザフィールドにread_only=Trueを設定します。

dbに保存するには、KlassSerializerに関係を保存するにはどうすればよいですか?

+0

はちょうどKlassSerializer –

+0

にModelSerializerのメソッドを作成する上書き私はメソッドを作成しようとしましたが、できません。それを書く方法を教えてください。ありがとう – msln

答えて

1

以下のようなあなたのシリアライザを変更:

class KlassSerializer(serializers.ModelSerializer): 
    # teacher = ProfileSerializer() # No need to this! 

    class Meta: 
     model = Klass 
     # fields = ('id', 'title', 'description', 'teacher') 
     fields = ('id', 'title', 'description') # Omit teacher 

そして、要求されたユーザーからプロファイルを取得し、あなたのシリアライザに渡し:

def post(self,request, pk=None): 
    """For Creating A Class""" 
    serializer = KlassSerializer(data=request.data) 
    if serializer.is_valid(): 
     teacher = ProfileSerializer(request.data['teacher']['pk']) 
     serializer.teacher = teacher.data    
     serializer.save(teacher=request.user.profile) # Retrieve teacher and stroe 
     return Response({'data': serializer.data}) 
    else: 
     return Response({'data': serializer.errors}) 
+0

親愛なるホセインに感謝しましたが、教師の名前やアバターなどのクラスデータをアプリケーションに送信することになりました。あなたの答えは、データをdbに保存するという問題を解決しましたが、今私は教師のデータをどのように送ることができますか?ありがとうございます – msln

+0

yrようこそ、上記の答えが正しい場合は、メソッドを取得し、あなたが望むすべてを返すために別のシリアライザを定義することができます –

0

KlassSerializerのModelSerializerのcreateメソッドをオーバーライドするだけです。まず

class KlassSerializer(serializers.ModelSerializer): 
    teacher = ProfileSerializer()   

    class Meta: 
     model = Klass 
     fields = ('id', 'title', 'description', 'teacher') 

    def create(self, validated_data): 
     profile = Profile.objects.filter(pk=validated_data['teacher']['pk']) 
     if profile: 
      k = Klass() 
      k.teacher = profile 
      ... 
+0

jsonから教師の価値を得る 'Klass'インスタンスを保存し、新しいProfileインスタンスを作成しません。 Klassインスタンスを作成するにはどうすればいいですか? – msln

+0

updated ........... –

関連する問題