(2022.11.01) Today I Learned_Day-43

imRound·2022년 11월 1일
0
post-thumbnail

Q object에 대해서...

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

Q() 은 Product.objects.all() 과 똑같다.

Product 전체를 변수에 담아두고, q변수 안에 조건들을 넣어주는 느낌!

즉, q &= Q(sub_categorycategoryname=category)는 q라는 변수안에 조건들을 하나하나 넣어주고 마지막 filter에 그 변수를 넣어서 쿼리를 한번만 날려도 되도록 해준다.

이게 &를 사용 했을 때 (교집합)

이게 |를 사용 했을 때 (합집합)

Complex lookups with Q objects

Keyword 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).

[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
    }
]
profile
Django 개발자

0개의 댓글