django filtering에 Q 사용하기

go easy on NG·2023년 3월 31일
0

Q&A

목록 보기
16/18

코드

houses.views.py

from django.db.models import Q

			...
            
	def get(self, request):

        # 방종류
        room_kind = request.GET.get("room_kind")

        # 매매종류
        sell_kind = request.GET.get("sell_kind")

        # 매매가
        sale_start = request.GET.get("sale_start")
        sale_end = request.GET.get("sale_end")

        # 보증금
        deposit_start = request.GET.get("deposit_start")
        deposit_end = request.GET.get("deposit_end")

        # 월세
        monthly_rent_start = request.GET.get("monthly_rent_start")
        monthly_rent_end = request.GET.get("monthly_rent_end")

        # 관리비
        maintenance_cost_start = request.GET.get("maintenance_cost_start")
        maintenance_cost_end = request.GET.get("maintenance_cost_end")

        # 방개수
        num_of_room = request.GET.get("num_of_room")

        # 화장실개수
        num_of_toilet = request.GET.get("num_of_toilet")

        # 평수
        pyeongsu = request.GET.get("pyeongsu")

        # 주소 : 동
        dong = request.GET.get("dong")

        filters = []
        # 방종류 필터링
        if room_kind != None:
            filters.append(Q(room_kind=room_kind))

        # 매매종류 필터링
        if sell_kind != None:
            filters.append(Q(sell_kind=sell_kind))

        # 매매가 필터링

        if sale_start != None or sale_end != None:
            if sale_start != None and sale_end != None:
                filters.append(Q(sale__range=(sale_start, sale_end)))
            elif sale_start != None:
                filters.append(Q(sale__gte=sale_start))
            elif sale_end != None:
                filters.append(Q(sale__lte=sale_end))

        # 보증금 필터링
        if deposit_start != None or deposit_end != None:
            if deposit_start != None and deposit_end != None:
                filters.append(Q(deposit__range=(deposit_start, deposit_end)))
            elif deposit_start != None:
                filters.append(Q(deposit__gte=deposit_start))
            elif deposit_end != None:
                filters.append(Q(deposit__lte=deposit_end))

        # 월세 필터링
        if monthly_rent_start != None or monthly_rent_end != None:
            if monthly_rent_start != None and monthly_rent_end != None:
                filters.append(
                    Q(monthly_rent__range=(monthly_rent_start, monthly_rent_end))
                )
            elif monthly_rent_start != None:
                filters.append(Q(monthly_rent__gte=monthly_rent_start))
            elif monthly_rent_end != None:
                filters.append(Q(monthly_rent__lte=monthly_rent_end))

        # 관리비 필터링
        if maintenance_cost_start != None or maintenance_cost_end != None:
            if maintenance_cost_start != None and maintenance_cost_end != None:
                filters.append(
                    Q(
                        maintenance_cost__range=(
                            maintenance_cost_start,
                            maintenance_cost_end,
                        )
                    )
                )
            elif maintenance_cost_start != None:
                filters.append(Q(maintenance_cost__gte=maintenance_cost_start))
            elif maintenance_cost_end != None:
                filters.append(Q(maintenance_cost__lte=maintenance_cost_end))

        # 방개수 필터링
        if num_of_room != None:
            if num_of_room == "1" or num_of_room == "2" or num_of_room == "3":
                filters.append(Q(room=num_of_room))
            else:
                filters.append(Q(room__gte=4))

        # 화장실개수 필터링
        if num_of_toilet != None:
            if num_of_toilet == "1" or num_of_toilet == "2" or num_of_toilet == "3":
                filters.append(Q(toilet=num_of_toilet))
            else:
                filters.append(Q(toilet__gte=4))

        # 평수 필터링
        if pyeongsu == "10":
            filters.append(Q(pyeongsu__range=(10, 19)))
        elif pyeongsu == "20":
            filters.append(Q(pyeongsu__range=(20, 29)))
        elif pyeongsu == "30":
            filters.append(Q(pyeongsu__range=(30, 39)))
        elif pyeongsu == "40":
            filters.append(Q(pyeongsu__range=(40, 49)))
        elif pyeongsu == "50":
            filters.append(Q(pyeongsu__gt=50))
        elif pyeongsu == "0":
            filters.append(Q(pyeongsu__range=(1, 9)))

        filters.append(Q(is_sale=True))

        # 동 필터링
        if dong != None:
            filters.append(Q(dong=dong))

        if filters:
            house = House.objects.filter(*filters)
        else:
            house = House.objects.filter(is_sale=True)

        # 조회(최저가격순, 방문순, 최신순)
        sort_by = request.GET.get("sort_by")

        if sort_by == "row_price":
            if sell_kind == "SALE":
                house = house.order_by("sale")
            if sell_kind == "CHARTER":
                house = house.order_by("deposit")
            if sell_kind == "MONTHLY_RENT":
                house = house.order_by("monthly_rent")
        elif sort_by == "visited":
            house = house.order_by("-visited")
        elif sort_by == "lastest":
            house = house.order_by("-created_at")

코드 설명

  • 각각의 모델을 filter을 하고 sort를 할때 일부의 조건들이 모두 적용된 값을 나타내고자 함
  • filters라는 빈 배열에 조건에 해당하는 값을 append(추가)해준다.
  • append할 때 Q로 AND연산자로서 사용해 넣어준다

개념

  • Q 객체를 이용하면 SQL 질의문의 WHERE 절에 해당하는 기능 사용할 수 있다.
  • Q 객체를 이용해 OR 연산, AND 연산, NOT 연산을 수행할 수 있다.
profile
🐥개발자

0개의 댓글