본문 바로가기
관리자

Programming-[Backend]/Django

Django nested Serializer update 시 선언되지 않은 field 문제

728x90
반응형

 

1. 문제점

부모 - 자식의 구조를 갖는  Nested된 Serializer 구조를 사용했는데, update 메서드를 Django에서 지원하지 않는다고 하면서 아래 같은 에러 메시지가 뜬다.

 

AssertionError: The `.update()` method does not support writable nested fields by default.
Write an explicit `.update()` method for serializer `...`, or set `read_only=True` on nested serializer fields.

 

 

 

2. 해결 방안

필드를 사용할 때 반드시 Model에서 역참조로 related_name 값으로 정의한 이름으로 사용해주어야 한다.

 

School : People = 1: N 으로 정의해놓고, 특정 SchoolSerializer에서는 people 중에 student만 처리한다는 생각으로 StudentSerializer를 만들고, SchoolSerializer에서 필드 이름을 students라고 처리하면 안된다. ModelSerializer를 사용하므로 반드시 related_name으로 정의한 이름으로 적어줘야한다.

## Serializer 사용
class StudentSerializer(serializers.ModelSerializer):
    name = serializers.CharField()
    number = serializers.IntergerField()

    class Meta:
        model = People
        fields = ['name', 'number']

class SchoolSerializer(serializers.ModelSerializer):
    people = StudentSerializer(many=True) #students라고 임의로 이름을 지으면 에러
    address = serializers.CharField()
    
    class Meta:
    	model = School
        fields = ['people', 'address']
        

## Model 정의
class People:

	... 중략
    school = ForeignKey("School", related_name="people")

 

728x90
반응형