All that I've dreamed of

[Django] Q객체로 filter() 사용하기 본문

Django

[Django] Q객체로 filter() 사용하기

_베토디 2022. 12. 21. 12:42
반응형

 

group = Workgroup.objects.get(pk=group_pk)

# q 객체 생성
q = Q()

>>> users = group.user_set.annotate(user=F("pk")).values("user")
<QuerySet [{'user': 1}, {'user': 24}]>

for user in users:
     q |= Q(**user)
 
그룹에 속한 유저의 유저의 pk만 가져올 건데 그냥 values("user") 만 쓰면
{'pk': 1} 이렇게 필드 값이 key 값으로 들어가게 된다
 
>>> users = group.users.values("pk")
>>> users
<QuerySet [{'pk': 1}, {'pk': 24}]>
 
저 key값을 변경하고 싶으면 annotate 와 F객체를 사용해 주면 된다
pk 를 user 로 변경했다. (Today 모델의 user 필드를 사용해야 하기 때문에...)
 
* 조건에 해당되는 모든 유저를 가져올 것이기 때문에 OR 연산자인 |= 를 사용했다.  (AND는 &= 를 쓰면 된다)
 
* q 객체에 값을 넣으려면  q |= Q(key=value) 형태로 넣어줘야 하기 때문에 **언패킹을 사용했다.
그러면 'user': 1 이 user=1 로 들어가게 된다
 
아래와 같이 filter 함수에 q 변수를 넣어주기만 하면 된다.
 
todays = Today.objects.filter(q, created_at__contains='2022-12-10')
 
=> 2022-12-10 작성된 투데이 중에서 user = 1 이거나 user = 24 인 것을 가져온다.

 

Comments