erp 도전

데이터 조회 : 특정 기간동안 + 코드 조회(Q, annotate, Concat)

나도초딩 2023. 4. 22.

 

 

Q 객체로 구현했고,

# filter 시, 포린키의 value 조회 방법

# annotate, Concat 으로 필드 결합

 

1) 특정 기간 : 

Q(d_date1__range=[start, end]

2) 여러 필드를 하나의 문자열로 합친 후, '검색어'가 포함돼있는지 조회.

............annotate(xxx = Concat('a__name',  'b', 'c'))..............

  • 상품기초코드 + 항공사코드 + 접미코드 필드를 합쳐서, '키워드'가 들어있는지?
  • 포린키의 실제 필드값을 조회 :  'basic_code__basic_code'
from django.db.models.functions import Concat
from django.db.models import CharField, Value
qs = TourItem.objects.annotate(xxx=Concat('basic_code__basic_code', 'air_code','suffix_code')).filter(Q(d_date1__range=[start, end]) & (Q(xxx__icontains=keyword) | Q(title__icontains=keyword)))

코드(조합 필드)를 왜 xxx 에 담았나?

여러 필드를 합친 필드를 admin 에서 보여주기 위해, 모델에 메서드를 추가했는데, 이름이 같아서 오류가 생겼다.

AttributeError: can't set attribute

필드처럼 사용할 목적으로 메서드를 만들었고, 이 필드로 쿼리를 수행할 수 있을거라 기대했는데, 안됐다.(방법을 못찾았다?)

    @property
    def item_code(self):
        day_code = self.d_date1.strftime("%Y%m%d")
        basic_code = self.basic_code.basic_code
        air_code = self.air_code
        code_suffix = self.suffix_code
        full_code = (day_code+basic_code+air_code+code_suffix)
        return full_code
 

결국, 정석대로 쿼리 수행시, Concat 으로 처리했다.

3) 쿼리 결과 화면에 뿌려주기 - 대쉬보드 스타일 :

  •  부트스트랩 페이지. 페이지네이션, 필터 등이 제공되고, 한번의 쿼리 후, 필터를 사용할 수 있다는 장점.
  • table2 : 필드명 클릭할 때마다, 쿼리를 수행. 익혀야할 것이 많아서, 글쎄...?
    ListView 상속 ( 한 화면에서 처리하기 위해서는 Form 처리 필요한 것을 감안하면, 글쎄? 사용할 이유가 지금은 안보인다.)

누가 장고 쉽다 했냐............ 하.........

간단한 블로그 만들기나 쉽지... 아호.

 

4) 검토

이런거 뭐 없나? 하고 검색하면서 시간이 너무 많이 소요되고 있다.

이 문제로 상당한 시간이 소요됐다... 뭐 복합기긴 하지만 ㅠ

  • 구글링 했을 때, 사례가 잘 안나오는 거 보면, 잘 사용하지 않는 방법인 것 같다. ㅠ 로직이 쓸데없이 복잡할 가능성이 높다. 못하니까, 생각나는대로 하는거지. 쉐도우 복싱 그만하고, 직접 해보기로 했으니까... 답답해도 가즈아

중급 강좌로 쇼핑몰 강의를 한번 들어야 빨라지지 않을까 싶다.

 

  • 애매하게 모르는 중급 팁 들만 빠르게 살펴봐야할 것 같다.
  • 디자인 레이아웃 잡는 것이 약점이므로, 프로젝트 강좌를 여러개 봐야겠다.
  •  

 

댓글