Django ORM(SQL WHERE문)

Sang Jun Lee·2020년 8월 9일
0

Django Model ORM에서 Q 객체를 이용하면 OR 연산, AND 연산, NOT 연산을 수행 할 수 있습니다. 몇가지 예재를 보며 확인해보겠습니다.

ORM

먼저 ORM에 대해 간단히 설명하고 이어서 설명하겠습니다. Object-relational Mapping의 약자로 데이터베이스와 객체 지향 프로그래밍 언어 간의 호환되지 않는 데이터를 변환하는 프로그래밍 기법입니다.

장점

  • 객체 지향적인 코드로 더 직관적이고 비지니스 로직에 집중할 수 있게 해줍니다.
  • 재사용 및 유지보수의 편리성이 증가합니다.
  • DBMS에 대한 종속성이 줄어듭니다.

단점

  • 완벽한 ORM으로만 서비스를 구현하기 어렵습니다.
  • 단계가 많은 시스템에서는 ORM의 객체 지향적인 장점을 활용하기가 어렵습니다.

이어서 Q 객체 활용법을 보겠습니다.

1. OR 연산

>>> queryset = User.objects.filter(
    Q(first_name__startswith='R') | Q(last_name__startswith='D')
)
>>> queryset
<QuerySet [<User: Ricky>, <User: Ritesh>, <User: Radha>, <User: Raghu>, <User: rishab>]>

2. AND 연산

>>> queryset = User.objects.filter(
    Q(first_name__startswith='R') & ~Q(last_name__startswith='Z')
)

실제 DB에서는 아래와 같이 작성될 수 있습니다.

SELECT "auth_user"."id",
       "auth_user"."password",
       "auth_user"."last_login",
       "auth_user"."is_superuser",
       "auth_user"."username",
       "auth_user"."first_name",
       "auth_user"."last_name",
       "auth_user"."email",
       "auth_user"."is_staff",
       "auth_user"."is_active",
       "auth_user"."date_joined"
FROM "auth_user"
WHERE ("auth_user"."first_name"::text LIKE R%
       AND NOT ("auth_user"."last_name"::text LIKE Z%))

프로젝트시 로그인 구현할때 아이디와 이메일 모두 체크하여야 하는 상황해서 사용할 수 있을텐데요.
코드보면서 확인하고 마무리하겠습니다.

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
Live now and Dream better tomorrow

0개의 댓글