Django ORM에서 SQL WHERE문 사용하기(Q)

jomminii_before·2020년 2월 27일
1

스타일쉐어의 로그인을 구현할 때 하나 간과한게 있었는데, 아이디나 이메일 둘 중 하나만 맞으면 로그인이 가능하다는 점이었습니다. 그래서 처음에는 아이디만 체크해서 회원이면 로그인이 가능하도록 비밀번호 체크 로직으로 넘겼는데, 이메일도 체크하도록 변경해야했습니다.

별 생각없이 아이디가 들어오면 if 문으로 처음 처리하고, 아이디가 안들어오면 elif 문으로 두 번째 조건으로 처리하게 코드를 작성했었는데, user를 지칭하는 변수가 중복으로 나오게되서 중복을 줄이고 싶었습니다.

이를 위해서는 Django ORM에서 둘 중 하나의 조건을 만족하는 값을 찾아야했는데, 여기서는 Q를 활용해서 해결했습니다.

Django ORM에서 Q는 SQL의 WHERE의 역할을 합니다. 불러들일 데이터의 조건을 설정하는 역할이죠.

Q를 사용하기 위해서는 먼저 django.db에서 import 해줘야합니다.

from django.db.models import Q

그리고 나서 아래와 같이 조건이 필요한 곳에 사용해주면 됩니다.
여기서는 프론트로부터 입력 받은 로그인아이디와 일치하는 로그인아이디가 DB에 있거나, 입력 받은 이메일과 일치하는 이메일이 DB에 존재하는지 확인하고, 둘 중 하나가 존재한다면 이 조건을 만족하는 user 객체를 불러와서 저장하는 용도로 사용했습니다.

if User.objects.filter(Q(login_id = login_id)|Q(email=email)).exists():
                user = User.objects.filter(Q(login_id = login_id)|Q(email = email))[0]

전체 코드를 보고 참고해보세요! 끝!
from django.db.models import Q

class SignInView(View):
    def post(self, request):
        data     = json.loads(request.body)
        login_id = data.get('login_id', None)
        email    = data.get('email', None)
        try:
            if User.objects.filter(Q(login_id = login_id)|Q(email=email)).exists():
                user = User.objects.filter(Q(login_id = login_id)|Q(email = email))[0]

                if bcrypt.checkpw(data['password'].encode('utf-8'), user.password.encode('utf-8')):
                    token = jwt.encode({'login_id':user.login_id}, SECRET_KEY, algorithm = 'HS256')
                    return JsonResponse({"token":token.decode('utf-8')}, status = 200)
                return HttpResponse(status = 401)
            return HttpResponse(status = 400)
        except KeyError:
            return JsonResponse({"message":"INVALID_KEYS"}, status = 400)
profile
https://velog.io/@jomminii 로 이동했습니다.

0개의 댓글