All that I've dreamed of

[Django] filter() 함수 AND / OR 본문

Django

[Django] filter() 함수 AND / OR

_베토디 2022. 11. 8. 23:36
반응형

 

 

새로운 쿼리셋을 반환하는 메서드 중 get() 과 더불어 정말 많이 사용되는 메서드인 filter()

 

* Django 공식문서

filter()

 

filter(*args, **kwargs)

Returns a new QuerySet containing objects that match the given lookup parameters.

The lookup parameters (**kwargs) should be in the format described in Field lookups below. Multiple parameters are joined via AND in the underlying SQL statement.

If you need to execute more complex queries (for example, queries with OR statements), you can use Q objects (*args).

 

 

**kwargs와 *args 두개의 파라미터를 받는데, **kwargs를 lookup 파라미터라고 하고 Field lookups에 나와있는 형태를 쓴다고 한다.

정리해 보자면 조건문 (WHERE)  의 역할이고 흔히 사용되는 __contains, __startswith,... 와 같은 것들이고 filter함수를 쓸 때 꼭 들어가야한다. 

 

그럼 *args는..?

마지막 줄을 보니 필수적으로 들어가야 하는 건 아니고 좀 더 복잡한 쿼리를 실행하고 싶을 때 (OR와 같은..) 사용하면 된다고 한다

 

 

from django.db.models import Q

filter_set = {
    "adult": "gte",
    "underate": "lt",
}
age = "adult"
age_filter = {f"age__{filter_set[age]}": 20}

# age_filter = {"age__gte":20}

User.objects.filter(Q(username__startswith="KIM"), **kwargs) 
#**kwargs = age__gte=20

-> 조건: (이름이 KIM 으로 시작) AND (age 가 20 이상)

 

* Q오브젝트 문서 참조

https://docs.djangoproject.com/en/4.1/topics/db/queries/#complex-lookups-with-q

Comments