[211028] 업무일지
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 옵션이 있다
Author And Source
이 문제에 관하여([211028] 업무일지), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@sylee0427/211028-업무일지저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)