4월 5일 TIL - django filter()
▷ 오늘의 일정
09:10 ~ 10:00 | 코딩테스트 문제풀기 in 페어 프로그래밍 |
10:00 ~ 11:00 | 장고 기초 개인 과제 설명 |
11:00 ~ 12:00 | 장고 강의 2주차 마무리 |
12:00 ~ 13:00 | 점 심 식 사 |
13:00 ~ 14:00 | 장고 강의 2주차까지 복습 & 개인과제 맛보기 |
14:00 ~ 15:00 | ERD 설계, 구축 특강 |
15:00 ~ 18:00 | 장고 강의 듣기 3주차까지! 아자! |
18:00 ~ 19:00 | 저 녁 식 사 |
19:00 ~ 20:40 | 하루 공부 내용 정리 및 TIL |
20:40 ~ 21:00 | 하루 공부 내용 공유 |
▷ 오늘의 배움
- collections...(to be continue
- itetools...(to be continue
- python manage.py makemigrations [app_name]
- 모델의 변경을 알리는 명령어 / 마이그레이션을 생성하는 명령어
- app_name을 입력하면 해당 app에 대해서만 마이그레이션을 생성하고 입력하지 않으면 전체 app의 마이그레이션을 생성
- python manage.py migrate [app_name] [migration_name]
- 변경된 모델을 등록하는 명령어 / 마이스레이션을 적용하는 명령어
- app_name을 입력하면 특정 app만 migrate 할 수 있으며 app_name 뒤에 마이그레이션 파일의 이름을 지정하면 해당 번호(버전)의 마이그레이션을 적용
- {% %}
- 템플릿에 있는 html 파일들을 이어주는 문법
- model
- 저장되고 사용되는 데이터의 형태
- 클래스를 데이터베이스의 형태로 만들어서 사용
- 어떤 역할을 하는 모델을 생성 할 것인지, 어떤 요소들을 담을것인지 고민이 필요
▷ 오늘의 시도
! 데이터베이스에 동일한 사용자가 있는 지 확인하기!
# 기존의 회원가입 view
def sign_up_view(request):
if request.method == 'GET':
return render(request, 'user/signup.html')
elif request.method == 'POST':
username = request.POST.get('username', None)
password = request.POST.get('password', None)
password2 = request.POST.get('password2', None)
bio = request.POST.get('bio',None)
if password != password2:
return render(request, 'user/signup.html')
else:
new_user = UserModel()
new_user.username = username
new_user.password = password
new_user.bio = bio
new_user.save()
return redirect('/sign-in')
# 데이터베이스에 존재하는 username을 입력해도 회원가입이 가능하다.
조건문으로 username이 데이터베이스에 존재하는 지 확인한 후 회원가입 정보가 등록될 수 있도록 하자. in을 이용하여 존재하는 지 확인이 가능할까? 데이터베이스는 어떻게 불러오지? 로그인 창을 만들 때 UserModel.objects.get()을 이용하여 입력한 username과 같은 값을 불러오도록 하였다. 이걸 어떻게 응용하면 안될까? 그런데 지금 해결해야 할 건 특정 데이터를 가져오는게 아니라 데이터의 존재여부이다. 흠,,, get() 대신 filter를 사용하여 없다면 안들 수 있게 할 수 없으려나?
# 그렇게 수정한 코드
def sign_up_view(request):
if request.method == 'GET':
return render(request, 'user/signup.html')
elif request.method == 'POST':
username = request.POST.get('username', None)
password = request.POST.get('password', None)
password2 = request.POST.get('password2', None)
bio = request.POST.get('bio',None)
if password != password2:
return render(request, 'user/signup.html')
else:
if UserModel.objects.filter(username__contains=username) is None:
new_user = UserModel()
new_user.username = username
new_user.password = password
new_user.bio = bio
new_user.save()
return redirect('/sign-in')
filter()는 특정 데이터로 필터링해서 가져온다. 인자로는 필드명=조건값 이 들어가며 2개 이상 들어갈 경우, 두 조건을 and로 묶어준다.
필드명__contains = 조건값 을 통해 조건값이 포함되는 데이터를 모두 가져온다. 흠 생각해보니 contain을 사용하면 hi라고 입력하면 hite, hiyo.. 등 입력된 단어가 들어갔으면 다 가지고 오겠구나. 흠 그럼 그냥 username이 동일한 경우만 필터링을 해보아야겠다.
아! get()은 해당데이터가 0개이거나 2개 이상이면 에러가 발생한다고 한다.
def sign_up_view(request):
if request.method == 'GET':
return render(request, 'user/signup.html')
elif request.method == 'POST':
username = request.POST.get('username', None)
password = request.POST.get('password', None)
password2 = request.POST.get('password2', None)
bio = request.POST.get('bio',None)
if password != password2:
return render(request, 'user/signup.html')
if UserModel.objects.filter(username=username):
return render(request, 'user/signup.html')
else:
new_user = UserModel()
new_user.username = username
new_user.password = password
new_user.bio = bio
new_user.save()
return redirect('/sign-in')
이 함수의 특징들이 몇가지 있다. 불러오는 결과는 복사본으로 변수에 할당해 사용할 수 있다. 실제 호출될 때만 실행된다.
그렇기 때문에 변수에 할당해 다시금 코드를 작성해주겠다.
def sign_up_view(request):
if request.method == 'GET':
return render(request, 'user/signup.html')
elif request.method == 'POST':
username = request.POST.get('username', None)
password = request.POST.get('password', None)
password2 = request.POST.get('password2', None)
bio = request.POST.get('bio',None)
if password != password2:
return render(request, 'user/signup.html')
else:
check_username = UserModel.objects.filter(username=username)
if check_username:
return render(request, 'user/signup.html')
else:
new_user = UserModel()
new_user.username = username
new_user.password = password
new_user.bio = bio
new_user.save()
return redirect('/sign-in')
▷ 오늘의 한줄
장고 어렵다... 너무너무 어렵다... 온통 모르는 말들 뿐이다.. 알아가야할 게 산더미다.. 앞으로 힘내자,,!