TIL(Today I Learned)

4월 5일 TIL - django filter()

Hyerin P. 2023. 4. 5. 20:41

▷ 오늘의 일정

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')

 

▷ 오늘의 한줄

장고 어렵다... 너무너무 어렵다... 온통 모르는 말들 뿐이다.. 알아가야할 게 산더미다.. 앞으로 힘내자,,!