코드
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 연산을 수행할 수 있다.