nested relationship의 경우 create 메서드를 오버라이딩하는 함수를 따로 만들어주어야 한다.
def create(self, validated_data):
counselor = Counselor.objects.create(**validated_data)
if "available_region" in self.validated_data:
available_region = self.validated_data.get("available_region")
for data in available_region:
data["region"] = Region.objects.get_or_create(name=data["region"])[0]
counselor_available_region(counselor=counselor, **data).save()
return counselor
[28/Oct/2021 15:34:58,473] - Broken pipe from ('127.0.0.1', 62452)
이런 거도 찍힌다.class CreateUpdateCounselorSerializer(BaseCounselorSerializer):
available_region = ReadCounselorRegionSerializer(write_only=True, many=True)
class Meta:
model = Counselor
fields = '__all__'
def get_or_create_regions(self, available_regions, counselor):
available_region_ids = []
counselor_available_region.objects.filter(counselor=counselor).delete() # 활동지역 초기화
for available_region in available_regions:
region_instance, created = Region.objects.get_or_create(**available_region.get("region"))
available_region_instance, created = counselor_available_region.objects.get_or_create(counselor=counselor,
region = region_instance,
detail=available_region.get("detail"))
available_region_ids.append(available_region_instance)
return available_region_ids
def create(self, validated_data):
available_regions = validated_data.pop('available_region', [])
counselor = Counselor.objects.create(**validated_data)
counselor.counselor_available_region_set.set(self.get_or_create_regions(available_regions, counselor))
return counselor
def update(self, counselor, validated_data):
if 'available_region' in validated_data.keys():
available_regions = validated_data.pop('available_region', [])
counselor.counselor_available_region_set.set(self.get_or_create_regions(available_regions, counselor))
for field, value in validated_data.items():
setattr(counselor, field, value)
counselor.save()
return counselor