[Django] Q 객체

Bik_Kyun·2022년 4월 3일
1
post-thumbnail

1. Q 객체

일반적으로 filter() 메소드를 사용하면 and 조건만 사용 가능하다.
장고 ORM에서 MySQL 쿼리문 처럼 or 조건을 쓰고 싶다면 Q객체를 사용하면 된다.

#sql 쿼리문
SELECT * FROM products WHERE main_category=boy OR category=boy-top
# 장고 orm
Product.objects.filter(Q(main_category=boy) | Q(category=boy-top))

2. Q()

from django.db.models import Q

class MainProductView(View):
    def get(self, request):
        try:
            main_category = request.GET.get('main', None)
            category      = request.GET.getlist('sub', None)
            sorting       = request.GET.get('order-by', 'latest')
            character     = request.GET.getlist('character', None)

            q = Q()
            if main_category:
                q &= Q(category__main_category__title=main_category)
            if category:
                q &= Q(category__title__in=category)
            if character:
                q &= Q(character__name__in=character)
          
            products    = Product.objects.filter(q)

Q()는 Products.objects.all()과 같은 의미이다.
연속되는 if문을 통해 q라는 변수에 조건식을 계속 추가 적용시키는 개념으로 이해하면 된다.
그리고 마지막에 q조건을 넣은 product 객체를 생성하는 것이다.
Q()속 조건식의 내용은 JOIN임을 기억하자.

3. 다중 필터

  1. 쿼리 파라미터를 받아올때 getlist로 받아오고
  2. Q()속 JOIN문에 __in 을 붙여 key에 대한 value가 모두 리스트로 들어옴을 명시한다.(INNER JOIN)

http://127.0.0.1:8000/products?main=boy&sub=boy-top&sub=boy-bottom
으로 요청 보내면



이렇게 적용된 결과를 확인할 수 있다.

profile
비진

0개의 댓글