[Django] Q 객체
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)
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. 다중 필터
- 쿼리 파라미터를 받아올때 getlist로 받아오고
- Q()속 JOIN문에
__in
을 붙여 key에 대한 value가 모두 리스트로 들어옴을 명시한다.(INNER JOIN)
- 쿼리 파라미터를 받아올때 getlist로 받아오고
- Q()속 JOIN문에
__in
을 붙여 key에 대한 value가 모두 리스트로 들어옴을 명시한다.(INNER JOIN)
http://127.0.0.1:8000/products?main=boy&sub=boy-top&sub=boy-bottom
으로 요청 보내면
이렇게 적용된 결과를 확인할 수 있다.
Author And Source
이 문제에 관하여([Django] Q 객체), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@kdh10806/Django-Q-객체저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)