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 |