[211028] 업무일지

이승연·2021년 10월 29일
0

업무일지들

목록 보기
45/49

1. nested relationships


nested relationship의 경우 create 메서드를 오버라이딩하는 함수를 따로 만들어주어야 한다.

2. 자동으로 transaction이 걸려있나?

    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
  • 실패해도 counselor가 생성되지 않음. lazy assignment 때문에 그런가해서 counselor에 할당 안해도 안만들어진다.

3. Transfer start (Waiting(TTFB)) 왜 이렇게 오래 걸려ㅠㅜ

  • 계산하는 쿼리가 많아서 그런 것 같아 모두 주석처리하고 다시 실행해보았다.
    • 0.4초로 줄었다.
  • 캐싱해보면 되지 않을까 해서 select_related를 통해 캐싱해보았다.
    • 18초 -> 20초로 늘어남..
    • [28/Oct/2021 15:34:58,473] - Broken pipe from ('127.0.0.1', 62452) 이런 거도 찍힌다.
  • 아주 큰 문제가 될 것 같은 쿼리만 주석처리 하고 다시 시도
    • 0.8초
  • 너무 많은 필드를 리턴해서 그런 것은 아니다. 걸리는 시간은 엇비슷하다.
  • annotate을 써봤다
  • 34초..

4. update와 read 할 때 키값은 같지만 format이 다를 때?

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
  • write-only 옵션이 있다

0개의 댓글