Home Django의 다양한 QuerySet
Post
Cancel

Django의 다양한 QuerySet

Django의 QuerySet은 데이터베이스에서 데이터를 조회, 필터링, 정렬, 그룹화 및 조작하기 위한 파이썬 객체입니다. QuerySet은 Django ORM의 핵심 개념 중 하나로, 데이터베이스 테이블에 대한 SQL 쿼리를 생성하고 실행하는데 사용됩니다.

filter

필드 조회는 SQL WHERE 절의 핵심을 지정하는 방법입니다. 이는 QuerySet 메소드 filter(), exclude()get()에 대한 키워드 인수로 지정됩니다.

exact, iexact - 일치

exact : 정확히 일치하는 데이터를 찾습니다.
iexact : 대소문자를 구분하지 않고 일치하는 데이터를 찾습니다. 값이 None이면, SQL Null로 해석됩니다.

1
2
3
4
Entry.objects.get(id__exact=14)
Entry.objects.get(id__exact=None)
Blog.objects.get(name__iexact="beatles blog")
Blog.objects.get(name__iexact=None)
1
2
3
4
SELECT ... WHERE id = 14;
SELECT ... WHERE id IS NULL;
SELECT ... WHERE name ILIKE 'beatles blog';
SELECT ... WHERE name IS NULL;

contains, icontains - 포함

contains : 포함하는 데이터를 찾습니다.
icontains : 대소문자를 구분하지 않고 일치하는 데이터를 찾습니다.

1
2
Entry.objects.get(headline__contains="Lennon")
Entry.objects.get(headline__icontains="Lennon")
1
2
SELECT ... WHERE headline LIKE '%Lennon%';
SELECT ... WHERE headline ILIKE '%Lennon%';

in - 주어진 목록 중 하나와 일치

list, tuple, string 또는 queryset과 같이 같이 반복가능한 객체를 대상으로 각 데이터를 조회합니다.

1
2
Entry.objects.filter(id__in=[1, 3, 4])
Entry.objects.filter(headline__in="abc")
1
2
SELECT ... WHERE id IN (1, 3, 4);
SELECT ... WHERE headline IN ('a', 'b', 'c');

또는 다음과 같이 queryset을 직접 조건으로 넣을 수 있습니다.

1
2
inner_qs = Blog.objects.filter(name__contains="Cheddar")
entries = Entry.objects.filter(blog__in=inner_qs)
1
SELECT ... WHERE blog.id IN (SELECT id FROM ... WHERE NAME LIKE '%Cheddar%')

gt, gte, lt, lte - 대소 관계 비교

gt : 비교대상보다 초과인 데이터를 조회합니다.
gte : 비교대상보다 이상인 데이터를 조회합니다.
lt : 비교대상보다 미만인 데이터를 조회합니다.
lte : 비교대상보다 이하인 데이터를 조회합니다.

1
Entry.objects.filter(id__gt=4)
1
SELECT ... WHERE id > 4;

startswith, istartswith, endswith, iendswith - 접두사, 접미사

startswith : 특정 문자열로 시작하는 데이터를 조회합니다. 대소문자를 구분합니다.
istartswith :특정 문자열로 시작하는 데이터를 조회합니다.
endswith : 특정 문자열로 끝나는 데이터를 조회합니다. 대소문자를 구분합니다.
iendswith : 특정 문자열로 끝나는 데이터를 조회합니다.

1
2
3
4
Entry.objects.filter(headline__startswith='Lennon')
Entry.objects.filter(headline__istartswith="Lennon")
Entry.objects.filter(headline__endswith='Lennon')
Entry.objects.filter(headline__iendswith="Lennon")
1
2
3
4
SELECT ... WHERE headline LIKE 'Lennon%';
SELECT ... WHERE headline ILIKE 'Lennon%';
SELECT ... WHERE headline LIKE '%Lennon';
SELECT ... WHERE headline ILIKE '%Lennon';

range - 범위

조건에 포함되는 범위의 데이터를 조회합니다.

1
2
3
4
5
import datetime

start_date = datetime.date(2005, 1, 1)
end_date = datetime.date(2005, 3, 31)
Entry.objects.filter(pub_date__range=(start_date, end_date))
1
SELECT ... WHERE pub_date BETWEEN '2005-01-01' and '2005-03-31';


참고

공식문서