본문 바로가기

TIL/Python

[DRF] Nested Serializer

class AccountSiginAPIView(APIView):
    def post(self, request):
        account_serializer = AccountSerializer(data=request.data)

        if account_serializer.is_valid(raise_exception=True):
            subject = account_serializer.validated_data["subject"]

            if subject == "Patient":
                patient_serializer = PatientSerializer(data=request.data)

                if patient_serializer.is_valid(raise_exception=True):
                    account = account_serializer.save()
                    patient_serializer.save(account=account)
                    return Response(patient_serializer.data, status=status.HTTP_201_CREATED)
                
            elif subject == "Practitioner":
                practitioner_serializer = PractitionerSerializer(data=request.data)

                if practitioner_serializer.is_valid(raise_exception=True):
                    account = account_serializer.save()
                    practitioner_serializer.save(account=account)
                    return Response(practitioner_serializer.data, status=status.HTTP_201_CREATED)

 

class AccountSerializer(serializers.ModelSerializer):
    class Meta:
        model = Account
        fields = '__all__'


class PatientSerializer(serializers.ModelSerializer):
    name = HumanNameSerializer()
    telecom = ContactPointSerializer()
    address = AddressSerializer(required=False)
    related_person = RelatedPersonSerializer(required=False)
    medical_record = MedicalRecordSerializer(required=False)

    class Meta:
        model = Patient
        fields = '__all__'

    def create(self, validated_data):
        name_data = validated_data.pop('name', None)
        telecom_data = validated_data.pop('telecom', None)
        address_data = validated_data.pop('address', None)
        related_person_data = validated_data.pop('related_person', None)
        medical_record_data = validated_data.pop('medical_record', None)

        patient = Patient.objects.create(**validated_data)

        if name_data:
            name = HumanName.objects.create(**name_data)
            patient.name = name
        if telecom_data:
            telecom = ContactPoint.objects.create(**telecom_data)
            patient.telecom = telecom
        if address_data:
            address = Address.objects.create(**address_data)
            patient.address = address
        if related_person_data:
            related_person = RelatedPerson.objects.create(**related_person_data)
            patient.related_person = related_person
        if medical_record_data:
            medical_record = MedicalRecord.objects.create(**medical_record_data)
            patient.medical_record=medical_record

        patient.save()
        return patient
        
    def update(self, instance, validated_data):
        name_data = validated_data.pop('name', None)
        telecom_data = validated_data.pop('telecom', None)
        address_data = validated_data.pop('address', None)
        related_person_data = validated_data.pop('related_person', None)
        medical_record_data = validated_data.pop('medical_record', None)

        instance = super().update(instance, validated_data)

        if name_data:
            name_serializer = HumanNameSerializer(instance.name, data=name_data)
            if name_serializer.is_valid():
                name_serializer.save()
        if telecom_data:
            telecom_serializer = ContactPointSerializer(instance.telecom, data=telecom_data)
            if telecom_serializer.is_valid():
                telecom_serializer.save()
        if address_data:
            address_serializer = AddressSerializer(instance.address, data=address_data)
            if address_serializer.is_valid():
                address_serializer.save()
        if related_person_data:
            related_person_serializer = RelatedPersonSerializer(instance.related_person, data=related_person_data)
            if related_person_serializer.is_valid():
                related_person_serializer.save()
        if medical_record_data:
            medical_record_serializer = MedicalRecordSerializer(instance.medical_record, data=medical_record_data)
            if medical_record_serializer.is_valid():
                medical_record_serializer.save()

        instance.save()
        return instance

'TIL > Python' 카테고리의 다른 글

Django - 도메인이 다를 경우 Cookie.set()  (0) 2024.06.10
Django 서로 다른 필드 값 합치기  (0) 2024.06.05
[Python] 웹 크롤링 / trafilatura  (0) 2024.05.07
Django Test code  (0) 2024.05.03
DRF JWT로 로그아웃 기능 넣기  (0) 2024.05.01