TIL 2022.12.19 ~ 12.25

김경민·2022년 12월 30일
0

TIL

목록 보기
9/15
post-thumbnail

[TIL/114일차/12.19] 배포 모드 정리, linux cp ft. 내배캠

  • settings.py에 DP_MODE를 설정하여 개발 환경과 배포환경에 맞게 설정해줌.
  • ec2 postgresql의 볼륨에 media의 default사진이 들어가지 않아서 cp 명령어를 이용하여 복사함.

[TIL/115일차/12.20] 알림 기능 세팅 ft. 내배캠

async_to_sync를 활용하여 channels_layer를 가져오고 group_send를 통하여 알람 기능도 만들 예정이다.

async_to_sync(layer.group_send)(f'alram_{goods.buyer.id}', {'type': 'chat_message', 'response': json.dumps({'response_type': 'alram', 'message': '낙찰됨'})})

[TIL/116일차/12.21] 리팩토링 ft. 내배캠

팀원 분이 맡아서 하는 부분을 내가 맡게 되면서 기존의 APIView를 ModelViewSet으로 바꾸면서 쿼리를 줄이고 Restfull하게 짜려고 노력해 보았다.

from django.db.models import Prefetch

class IsTrader(permissions.BasePermission):

    def has_object_permission(self, request, view, obj):
        return request.user in [obj.goods.seller, obj.goods.buyer]

class ChatViewSet(ModelViewSet):
    """
    리스트 'list' 요청이 오면 채팅방 리스트를 보내줍니다.
    특정 방의 요청이 'retrive' 오면 채팅방의 채팅들을 보내줍니다.
    """
    permission_classes = [IsTrader,]
    
    def get_permissions(self):
        if self.action == 'list':
            return [permissions.IsAuthenticated(),]
        return super(ChatViewSet, self).get_permissions()

    def get_serializer_class(self):
        if self.action == 'list':
            return TradeInfoSerializer
        elif self.action == 'retrive':
            return TradeMessageSerializer
        else:
            return None
    def get_serializer_context(self):
        # print(self.request.data)
        return {
            'request': self.request,
            'format': self.format_kwarg,
            'view': self,
            'action' : self.action
        }
    def get_queryset(self):
        print(dir(Goods.objects.first()))
        user_id = self.request.user.id
        if self.action == 'list':
            goods = Goods.objects.filter(status = False, buyer__isnull=False).filter( Q(buyer_id = user_id) | Q(seller_id = user_id)).select_related('seller', 'buyer', 'trade_room').prefetch_related('trade_room__trademessage')
            return goods
        elif self.action == 'retrive':
            return TradeChatRoom.objects.all()
        else:
            return None

[TIL/117일차/12.22] 채팅 view 리팩토링 생각 정리 ft. 내배캠

  • 설계 로직

채팅방 리스트 큰 틀 : 내가 구매 혹은 판매 물품의 거래 채팅방을 최근 업데이트 된 날짜로 나열하여 보여준다.
1. 물풀의 객체들에서 상태 값은 False(경매가 끝남), 구매자는 있어야한다.
2. 물품의 구매자 혹은 판매자가 자신이어여야만 한다.
3. 쿼리 수를 줄이기 위해,prefetch 와 select를 사용한다.
4. Goods의 trade_room은 TradeCahtRoom을 외래키로 참조한다(원래는 oto이 맞다).
- annotate를 사용하여 trade_room의 업데이트 날짜 trade_room__updated_at을 가져와
- updated_at의 임의의 컬럼을 만들어 정렬해 준다.

  1. 선택된 Goods의 객체들을 TradeInfoSerializer에 넣어서 보낸다.
    • wait_cnt : 쿼리 요청을 한 번 더 보내지 않기 위해 반복문을 통하여 길이를 구함
    • image : 첫 번째 사진의 url만 필요함. first()를 쓰지 않은 것은 위와 같이 쿼리 요청을 안하기 위하여
    • last_message : 인덱싱을 통하여 마지막 요소를 가져오나, Negative인덱싱은 불가능하여 (전체 길이 -1)을 try except 구문을 사용하여 담아

개별 채팅 방 틀 : 요청자의 권한을 파악, 메시지 읽음 처리
1. 특정 Goods 객체의 판매자 혹은 구매자를 판별
2. 해당 객체의 메시지들을 가져와 내가 작성한 것들을 제외한 메시지를 읽음 처리함.

[TIL/118일차/12.23] 참여자 피드백 ft. 내배캠

참여자 피드백

  • 입찰 내역, 채팅 내역, 참여자들 정보들
  • 경매 시작 알람, 낙찰 알람, 입찰 경쟁 알람

[WIL] 17주차 ft. 내배캠

회고

  • 프로젝트 리팩토링 기간이기도 하며 다음 주면 캠프가 끝난다.
  • 재밌기도 하고 힘들기도 했다.
  • 돌이켜 보면 4개월 동안 필수적인 일을 제외하면 밖으로 나갔던 날은 손으로 꼽는 것 같다. ㅋㅋㅋ
  • 운동도 안 해버려서 피폐해진 감이 없잖아 있는데 곧 끝나니 운동도 다시 시작하며 힘차게 취업 전선에 뛰어들자!
profile
적은 대로 된다.

0개의 댓글