1

django-rest-framework에서 보낸 json 데이터를 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() 방법은 기본적으로 쓰기 중첩 된 필드를 지원하지 않습니다. serializer mainp.serializers.KlassSerializer에 대해 명시적인 .create() 메서드를 작성하거나 중첩 된 serializer 필드에 read_only=True을 설정하십시오.

DB에 저장하려면 어떻게 관계를 KlassSerializer에 저장할 수 있습니까?

+0

그냥 KlassSerializer –

+0

에 ModelSerializer의 방법을 만들 오버라이드 (override) 메서드를 재정의하려고했지만 할 수 없습니다. 그것을 쓰는 방법을 보여 주시겠습니까? 감사합니다. – 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

예. 환영합니다. 메소드를 가져 오는 별도의 serializer를 정의하고 원하는 모든 것을 반환 할 수 있습니다. 위의 답변이 올바른 경우이를 승인하고 사실로 확인하십시오. –

0

KlassSerializer의 ModelSerializer 작성 메소드를 무시하십시오.

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' 인스턴스를 저장하고 싶습니다. 어떻게 Klass 인스턴스를 만들 수 있습니까 ?? – msln

+0

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