# 뭔가 복잡하고 두려워서,,,피하고 싶은데, 끙
한 개의 필드에 <table> 코드를 넣어서 구현하는 방식이 그나마 가장 간단한 방식이겠으나...
제대로 구현하면, 일자마다 일정, 식사, 주요 관광거리 등의 요소들이 들어가야 한다.
즉, 일정표 하루치가 무지 복잡해지는거다. 작업이 꽤 커짐
그리고, 각 일차는 상품코드와 fk 로 연결돼 있어야 하고,
댓글 모델과 비슷하다.
근데, 이걸 1년 치 일정을 복사한다 치면, 와.... db 추가/수정 양이 엄청 많네.
bulk_create , update 를 안쓸수가 없겠구먼...
뭔가 생각만으로도 좀 복잡하다..... 상품이 먼저 추가되고, 거기에 딸린 일정이 fk 로 일자마다 연속추가되는 형태인데,
끙...몰라 몰라.... 생각만으로도 복잡해.
이건 좀 나중으로 미뤄야겠다.
작업이 너무 크다. 아니, 그냥 로직을 못짜서 그래... 이 안에는 ORM. 특히, 초보자로서 포린키 관련 두려움?
## 어차피 넘어야 할 산. 아니 언덕 +_+
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 문으로 가즈아.
'erp 도전' 카테고리의 다른 글
일정표 구현 4) 수정/삭제 (0) | 2023.04.26 |
---|---|
레코드 복사, 반복문 추가, bulk_update 등 (0) | 2023.04.26 |
장고 마이그레이션 에러 / 복구 showmigrations (0) | 2023.04.26 |
일정표 구현 3: 조/중/석 구분값으로 저장, 사용하기 (0) | 2023.04.25 |
일정표 구현 1) tinymce (0) | 2023.04.24 |
장고 필터 django-filter (0) | 2023.04.22 |
데이터 조회 : 특정 기간동안 + 코드 조회(Q, annotate, Concat) (0) | 2023.04.22 |
table2 테이블 모듈 (0) | 2023.04.22 |
댓글