파이썬 - 정규식을 이용한 특정 문자열 선별
- 이번에는 사용자가 숙소 업체 플랫폼 사이트에서 특정 검색키워드, 숙박할 인원 조건에 해당하는 숙소를 검색할 때 정규식을 사용하여 조건에 해당되는 숙소를 찾는 방법에 대해 알아볼 것이다.
사용자가 조건 설정하여 원하는 숙소 조회 시, 정규식을 사용하여 검색어에 해당되는 숙소 목록 제공하기
ex) yanolja_project
1. 모델 작성
- 경로 : yanolja_project > stay(앱) > models.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26from django.db import models
from taggit.managers import TaggableManager
class Category(models.Model):
staying = models.CharField(max_length=50) # 모텔, 호텔/리조트, 펜션/풀빌라, 게스트하우스
def __str__(self):
return self.staying
class Stay(models.Model):
# 모텔, 호텔,리조트, 펜션/풀빌라, 게스트하우스 선택
category = models.ForeignKey(Category, on_delete=models.SET, null=True, blank=True, related_name="stays")
# 숙소 이름(ex. 역삼 바레)
name = models.CharField(max_length=50)
# 유저 아이디(ex. positipman)
username = models.ForeignKey(get_user_model(), on_delete=models.CASCADE, related_name="stays")
# 숙소 위치(ex. 서울특별시 강남구 봉은사로 428)
location = models.CharField(max_length=100)
# 검색 관련 키워드
keywords = TaggableManager()
...
2. 변경사항 저장 및 migrate 진행
- 경로 : yanolja_project
1
2$ python manage.py makemigrations
$ python manage.py migrate
3. 뷰 페이지 작성 (검색 키워드 필터링)
- 경로 : yanolja_project > stay > views.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51def stay_list(request):
if request.method == "POST":
# 프론트단으로부터 (모텔, 호텔/리조트, 펜션/풀빌라, 게스트하우스 중 1 택) 정보를 category라는 문자열 형태의 변수로 받는다.
category_str = request.POST.get('category', None)
category_obj = Category.objects.get(staying=category_str)
# 특정 category에 해당하는 숙소 필터링
stays = Stay.objects.filter(category=category_obj)
# <--메인페이지 검색페이지에서 사용자가 키워드 입력한 경우 해당 숙소 필터링하는 코드-->
# 프론트단으로부터 검색 키워드를 'searchKeyword'라는 문자열 형태의 변수로 받는다.
# ex) "강남/역삼/선릉/삼성", "서울 송파구 올림픽대로", "역삼 마레", "역삼" ...
search_keyword = request.POST.get('searchKeyword', None)
# 사용자가 입력한 키워드에 해당하는 숙소 객체 선별
if search_keyword is not None:
# 검색 키워드에서 한글, 정수, 영문 키워드만 필터링하여 리스트로 변환
# ex. "강남,역삼/삼성, 테헤란로2길 artist" --> ['강남','역삼','삼성','테헤란로2길, 'artist']
not_hangul = re.compile('[^가-힣\da-z]+')
result_str = not_hangul.sub(' ', search_keyword)
result_list = result_str.split(' ')
# Stay 모델의 name에 검색 키워드가 있는 숙소 필터링
# ex. result_list = ['강남, '역삼', '삼성', '테헤란로2길', 'artist']
que_name = Q(name__icontains=result_list[0])
for keyword in result_list[1:]:
que_name |= Q(name__icontains=keyword)
# Stay 모델의 location에 검색 키워드가 있는 숙소 필터링
que_location = Q(location__icontains=result_list[0])
for keyword in result_list[1:]:
que_location |= Q(location__icontains=keyword)
# Stay 모델의 name 또는 location 또는 keywords 필드에 검색 키워드가 있는 숙소 필터링(숙소 객체 중복 불가)
stays = stays.filter(Q(keywords__name__in=result_list)|que_name|que_location).distinct()
# 검색 키워드에 해당하는 숙소가 없을 경우
if not stays.exists():
return JsonResponse({'searchResult':False})
# <--메인페이지 검색페이지에서 사용자가 총 인원수(성인+아동) 설정한 경우 해당 숙소 필터링하는 코드-->
# 프론트단으로부터 총 인원 수를 'personnel'이라는 변수(int type)로 받는다.
personnel = request.POST.get('personnel', None)
# 사용자가 설정한 인원수를 수용할 수 있는 숙소 객체 선별
stays = stays.filter(rooms__maximumPersonnel__gte=personnel).distinct()
return render(request, 'stay/stay_list.html', {'objects': stays})
# request method가 POST 아닌 경우
else:
stays = Stay.objects.all()
return render(request, 'stay/stay_list.html', {'objects':stays})
Posted