[Django] Q객체를 이용한 카테고리 분류

2021. 11. 4. 12:10코딩일지/Django

Q객체 란?

keyword arguments의 집합이라고 불리며,

where 절에 or / and / not 등 이용할 때 사용한다

즉, 장고ORM 에서 쿼리문처럼 or 조건을 쓰고 싶을때 사용할 수 있다.

 

코드 블럭

import json

from django.http.response import JsonResponse
from django.views         import View
from django.db.models     import Q

from json.decoder     import JSONDecodeError
from users.decorators import login_decorator
from .models          import Post, Category, Saveip


class PostListView(View):
    def get(self,request):
        try:
            offset   = int(request.GET.get('offset', 0))
            limit    = int(request.GET.get('limit', 5))
            category = request.GET.get('category')
            search   = request.GET.get('search', None)
            q        = Q()

            if category:
                q &= Q(category__name = category)

            if search:
                q &= Q(title__icontains = search)
                
            posts = Post.objects.filter(q).select_related('category')[offset:offset+limit]
            count = len(posts)
            
            result = [{
                'author'     : post.user.name,
                'title'      : post.title,
                'content'    : post.content,
                'category'   : post.category.name,
                'created_at' : post.created_at.strftime('%Y-%m-%d %H:%M:%S'),
                'counting'   : post.counting
            }for post in posts]
            
            return JsonResponse({ "count" : count, "RESULT" : result}, status = 200)

        except KeyError:
            JsonResponse({'MESSAGE' : 'KEY_ERROR'}, status = 400)
        except ValueError:
            JsonResponse({'MESSAGE' : 'VALUE_ERROR'}, status = 400)
  • Q( ) 은 Post.objects.all() 와 같습니다.
  • Product 전체를 변수에 담아두고, q변수안에 조건들을 넣어서 필터링 해주는 형식
  • 위의 코드에서 q &= Q(category__name = category)는 q라는 변수안에 category_name를 받아서 filter에 변수를 넣어서 DB에 쿼리문 Hit를 줄일 수 있다.
  • 변수 q에 빈 값이 들어오거나 조건이 맞지않는 값이 들어왔을때는 전체를 반환합니다.

 

POSTMAN TEST

  • 카테고리는 잡담, 파이썬, 노드JS, 몽고DB로 미리 생성해뒀습니다.
  • 쿼리파라미터 Value에 잡담을 넣게되면 카테고리 : 잡담인 항목을 필터링해서 보여주게됩니다.

 

  • Value에 빈값을 넣게되면 q객체에 빈쿼리가 담기기 때문에 모든 자료들을 불러오게 됩니다.