erp 도전

일정표 구현2) : 공유 일정표와 개별 일정표 구현

나도초딩 2023. 4. 24.

# 뭔가 복잡하고 두려워서,,,피하고 싶은데, 끙

 

한 개의 필드에 <table> 코드를 넣어서 구현하는 방식이 그나마 가장 간단한 방식이겠으나...

 

제대로 구현하면, 일자마다 일정, 식사, 주요 관광거리 등의 요소들이 들어가야 한다.

 

즉, 일정표 하루치가 무지 복잡해지는거다. 작업이 꽤 커짐

 

그리고, 각 일차는 상품코드와 fk 로 연결돼 있어야 하고,

댓글 모델과 비슷하다.

근데, 이걸 1년 치 일정을 복사한다 치면, 와....  db 추가/수정 양이 엄청 많네.

bulk_create , update 를 안쓸수가 없겠구먼...

뭔가 생각만으로도 좀 복잡하다..... 상품이 먼저 추가되고, 거기에 딸린 일정이 fk 로 일자마다 연속추가되는 형태인데,

끙...몰라 몰라.... 생각만으로도 복잡해.

이건 좀 나중으로 미뤄야겠다.

작업이 너무 크다. 아니, 그냥 로직을 못짜서 그래... 이 안에는 ORM. 특히, 초보자로서 포린키 관련 두려움?

 

## 어차피 넘어야 할 산. 아니 언덕 +_+

iti_name = models.ForeignKey(ItiName, null=True, blank=True, on_delete=models.CASCADE)
 
share_iti_chk = models.BooleanField(default = True, help_text='해당 상품만 일정 수정시, 체크해제, 다시 체크하면 기본 일정표로.')

1 기본 값은 공유 일정표 사용 True

: 상품에서 '선택한 공유일정' (포린키로 지정한 ItiName)을 불러온다.

 

2 개별 일정표 사용

:  일정표 '복사/저장' 구현

2-1)  Iti 테이블에서 공유 일정표의 레코드로 그대로 복사하고, 이제 일정표를 수정해도, 공유 일정표에는 영향이 없다.

  • Iti 테이블에서 공유 일정표의 레코드로 그대로 복사한다.
  • 이때, 나를 참조하도록 touritem을 포린키로 넣어준다. 
  • 저장 클릭시, 공유 일정표 사용안함으로 변경. (touritem.share_iti_chk = 0)
  • 기존 저장된 일정표가 있다면 삭제한다.
def save_iti(request, pk):
    if request.user.is_authenticated:
        touritem = get_object_or_404(TourItem, pk=pk)
        # 저장시, 공유일정표 사용 해제
        touritem.share_iti_chk = 0
        touritem.save()
    # iti 객체를 저장한다. save 로
    # 기존 저장된 일정이 있다면, 삭제한다.
        try:
            Iti.objects.filter(touritem_id=touritem.pk).delete()
        except:
            print("기존 저장된 일정표 없뜸")
        for object in Iti.objects.filter(iti_name_id=touritem.iti_name.pk):
            object.pk = None
            object.touritem_id = touritem.pk
            # own 일정표인데, 일정표 이름이 있어서, 공유일정표로 보이는 것 방지.
            object.iti_name_id = None
            object.save()
        
        return redirect(touritem.get_absolute_url())            
    else:
        raise PermissionDenied

2-1) : 방금 복사한, 나(상품번호)를 참조하는 일정을 불러온다.

공유일정 체크돼있으면, 내가 참조하고 있는 일정표를 불러온다. 참 쉬운 이야기지만, 뇌가 또 느리게 작동한다.. ㅠㅠ

  • 내가 참조하고 있는 일정표는 iti 가 아니라,  iti_name 이다.
  • Iti 모델에서 iti_name(포린키)로  는 iti_name 을 참조하고 있다. - 실제 저장된 포린키의 필드명은 iti_name_id 이다.

즉, Iti 입장에서 불러오려면, ... 아 썅. 이러니 어렵지. Iti 로 조회할게 아니라, 더 쉬운 방법?

그림 그리면서 좀 도식화 해봐야겠다.

 

class TourItemDetail(DetailView):
    model = TourItem
    template_name = "tour/tour_item_detail.html"
    
    def get_context_data(self, **kwargs):
        context = super(TourItemDetail, self).get_context_data()
        touritem = context['object'] 
        
        if context['touritem'].share_iti_chk:    
            itis = Iti.objects.filter(iti_name_id=touritem.iti_name.pk)
        else:
            itis = self.object.iti_set.all()
        
        for iti in itis:
            f_list = iti.food.split(';') # 잘라서, 리스트로 변환
            iti.food = f_list #객체를 db에 save()하지 않고, context 오버라이딩용
        context['itis'] = itis
        context['iti_form'] = ItiForm
        return context

 

* 생각할 점

세부적으로 들어가면, 로직 충돌이 있어서, 지금은 orm 과 기본 로직을 잡는 단계니 넘 머리쓰지 말자. 헛 힘든다.

공유 일정표를 다시 사용시? 기존 저장한 일정표는 자동 삭제시켜야 하나?

공유 일정표를 다시 사용안하면? 다시 복/붙 save 진행시, update or create 로 적용해야할까? 아니면, 새로 저장해야할까?

기존에 수정한거 계속 쓴다 vs 공유 일정표 기준으로 무조건 초기화한다.

뭐 이런 로직을 명확히 해야하는데, 이건 정하기 나름이니까, 일단 심플하게 가자. 

update_or_create . for 문으로 가즈아.

댓글