Django 쇼핑몰 만들기-3

Sang Jun Park·2021년 1월 19일
0

포트폴리오-STREET

목록 보기
3/6

게으른 과거의 나를 미워하며 과거의 한 일을 다시 복기해서 쓰는 내용(1)


오늘 한 일

1. addressapp의 CRUD기능을 추가했다.(CR을 제외한 다른 부분)

  • 배송지 부분을 기획하며 배송지 목록을 보여주며 동시에 Form으로 생성도 가능하게 하고 싶었다. 따라서 이전에 Create부분을 만들었으니 FormMixin으로 List를 뿌리고 동시에 Form을 던졌다.

  • 또, 배송지 목록에서 선택을 통해
    특정한 배송지를 기본 배송지로 설정 또는 삭제 할 수 있게 하고 싶었다. 해당 부분은 jQuery를 이용해 선택된(checked) DOM을 얻고 value(PK)를 view로 넘겨 처리했다.

addressapp/view.py

def set_default_address(request, case):
    # 기존에 기본 주소로 설정되어 있는 레코드 탐색
    before_object = UserAddress.objects.filter(target_user=request.user, is_default=True)

    if before_object:  # 탐색된 레코드가 있다면
        if case == 'create':  # 새로운 배송지 추가시
            if request.POST.get('is_default', None) == 'checked':  # 기본 주소 설정 체크박스가 체크되었다면
                before_object.update(is_default=False)  # 해당 레코드의 기본 주소 설정 값을 False로 변경하고 True 반환
                return True
            else:
                return False

        elif case == 'update':  # 기존 배송지 중 기본 배송지로 변경하는 경우
            target_object = UserAddress.objects.filter(pk=request.POST.get('address_pk'))
            before_object.update(is_default=False)
            target_object.update(is_default=True)
    else:
        return True  # 탐색된 레코드가 없다면(최초 등록의 경우) True 반환
  • Delete의 경우 DeleteView를 상속받아 CBV로 구현했고
    위의 선택기능(jQuery로 선택된 DOM의 PK를 View로 던져서)을 통해 DeleteView가 알아서 처리하게 두었다.

요약 :
1. addressapp의 list에서 FormMixin을 상속받아 list에서 create할 수 있도록 수정
2. addressapp의 기본 배송지 설정 로직 추가
3. addressapp의 배송지 삭제 로직 추가


고민해야할 부분

1. Query를 낭비하지 않는가?

  • 기본 배송지 설정 로직이 정상적으로 작동하나.. set_default_address()에서 update()를 두번 호출하기에 query도 두번 날리는게 아닌가 싶다. ORM을 작성할 때 filter()에 select_related()를 붙여 캐시된 QuerySet을 이용하면 어떨까? Django에서 하나의 트랜잭션을 어떻게 처리하는지 이런 고급적인 내용도 찾아보고싶다.

여담으로
addressapp에 배송지를 수정하는(Update)는 구현하지 않을 생각이다. (귀찮) 나는 여지껏 인터넷 쇼핑하며 배송지를 수정해본적이 없따... 뭐 그래서...

profile
Django 개발자가 되고싶은 사람

0개의 댓글