[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객체에 빈쿼리가 담기기 때문에 모든 자료들을 불러오게 됩니다.

'코딩일지 > Django' 카테고리의 다른 글
[Django] Kakao 소셜로그인 API (0) | 2021.10.03 |
---|---|
[Django] Selected_related와 Prefetch_related (0) | 2021.09.11 |
[Django] Pagination과 offset, limit (0) | 2021.09.05 |
[Djagno] Westagram 회원가입 기능 구현 (0) | 2021.08.29 |
[Django] ManytoManyField (0) | 2021.08.26 |