장고 orm에서 쿼리문처럼 or 조건을 쓰고 싶을때 사용할 수 있다.
Q() 은 Product.objects.all() 과 똑같다.
Product 전체를 변수에 담아두고, q변수 안에 조건들을 넣어주는 느낌!
즉, q &= Q(sub_categorycategoryname=category)는 q라는 변수안에 조건들을 하나하나 넣어주고 마지막 filter에 그 변수를 넣어서 쿼리를 한번만 날려도 되도록 해준다.
이게 &를 사용 했을 때 (교집합)
이게 |를 사용 했을 때 (합집합)
Q
objectsKeyword argument queries – in [filter()](https://docs.djangoproject.com/en/4.1/ref/models/querysets/#django.db.models.query.QuerySet.filter)
, etc. – are “AND”ed together. If you need to execute more complex queries (for example, queries with OR
statements), you can use [Q objects](https://docs.djangoproject.com/en/4.1/ref/models/querysets/#django.db.models.Q)
.
A [Q object](https://docs.djangoproject.com/en/4.1/ref/models/querysets/#django.db.models.Q)
(django.db.models.Q
) is an object used to encapsulate a collection of keyword arguments. These keyword arguments are specified as in “Field lookups” above.
For example, this Q
object encapsulates a single LIKE
query:
참조: https://docs.djangoproject.com/en/4.1/topics/db/queries/
from django.db.models import Q
class FeedView(APIView): # 로그인 된 사람들만 가능 permission
permission_classes = [permissions.IsAuthenticated]
def get(self, request):
q = Q()
for user in request.user.followings.all(): # 팔로우 하고 있는 모든 유저들이 쿼리셋으로 돌아옴
q.add(Q(user=user),q.OR) # for 문 조건 유저가 해당하는지 / all로 가져와서 follow 한 사람들을 다 가져올 수가 있다.
feeds = Article.objects.filter(q)
serializer = ArticleListSerializer(feeds, many=True)
return Response(serializer.data)
[
{
"pk": 1,
"title": "게시글 만들어봅니다.",
"image": "/media/2022/10/zidane.jpg",
"updated_at": "2022-10-29T16:16:44.383279Z",
"user": "dong@k.com",
"likes_count": 0,
"comments_count": 0
}
]