본문 바로가기
파이썬/파이썬기본문법

파이썬 Django QuerySet filter

by flycoding 2024. 3. 12.
반응형

파이썬 Django QuerySet filter

filter() 메서드는 검색을 필터링하는 데 사용되며 검색어와 일치하는 행만 반환할 수 있다.

이전 장에서 배운 것처럼 필드 이름을 다음과 같이 필터링할 수 있다:

이름이 'Emil'인 레코드만 반환한다:

template.html

<!DOCTYPE html>
<html>
<body>

<p>The queryset object:</p>

{{ mymembers }}

<p>Loop through the items:</p>

<table border='1'>
  <tr>
    <th>ID</th>
    <th>Firstname</th>
    <th>Lastname</th>
  </tr>
  {% for x in mymembers %}
    <tr>
      <td>{{ x.id }}</td>
      <td>{{ x.firstname }}</td>
      <td>{{ x.lastname }}</td>
    </tr>
  {% endfor %}
</table>

</body>
</html>
views.py

from django.http import HttpResponse
from django.template import loader
from .models import Member

def testing(request):
  mydata = Member.objects.filter(firstname='Emil').values()
  template = loader.get_template('template.html')
  context = {
    'mymembers': mydata,
  }
  return HttpResponse(template.render(context, request))
      


# Check out template.html to see how the mymembers object
# was used in the HTML code.

위의 코드를 실행하면 아래 그림과 같다.

파이썬 Django QuerySet filter() 메소드 활용 예제

 

SQL에서 위의 문장은 다음과 같이 적는다:

SELECT * FROM members WHERE firstname = 'Emil';

 

파이썬 Django QuerySet filter and

filter() 메서드는 인수를 **kwargs(키워드 인수)로 사용하므로 둘 이상의 필드를 쉼표로 구분하여 필터링할 수 있다.

 

firstname이 "Refsnes"이고 ID가 2인 레코드를 반환한다:

template.html

<!DOCTYPE html>
<html>
<body>

<p>The queryset object:</p>

{{ mymembers }}

<p>Loop through the items:</p>

<table border='1'>
  <tr>
    <th>ID</th>
    <th>Firstname</th>
    <th>Lastname</th>
  </tr>
  {% for x in mymembers %}
    <tr>
      <td>{{ x.id }}</td>
      <td>{{ x.firstname }}</td>
      <td>{{ x.lastname }}</td>
    </tr>
  {% endfor %}
</table>

</body>
</html>
views.py

from django.http import HttpResponse
from django.template import loader
from .models import Member

def testing(request):
  mydata = Member.objects.filter(lastname='Refsnes', id=2).values()
  template = loader.get_template('template.html')
  context = {
    'mymembers': mydata,
  }
  return HttpResponse(template.render(context, request))
      


# Check out template.html to see how the mymembers object
# was used in the HTML code.       

위의 코드를 실행하면 아래 그림과 같다.

파이썬 Django QuerySet filter() 여러 조건 활용 예제

 

SQL에서 위의 문장은 다음과 같이 적는다:

SELECT * FROM members WHERE lastname = 'Refsnes' AND id = 2;

 

파이썬 Django QuerySet filter or

이름이 Emil이거나 이름이 Tobias인 레코드를 반환하는 것은 위의 AND 예제처럼 쉽지 않다.

파이프 | 문자로 구분된 여러 필터() 메서드를 사용할 수 있다. 결과는 하나의 모델로 병합된다.

이름이 "Emil" 또는 "Tobias"인 경우 레코드를 반환한다:

template.html

<!DOCTYPE html>
<html>
<body>

<p>The queryset object:</p>

{{ mymembers }}

<p>Loop through the items:</p>

<table border='1'>
  <tr>
    <th>ID</th>
    <th>Firstname</th>
    <th>Lastname</th>
  </tr>
  {% for x in mymembers %}
    <tr>
      <td>{{ x.id }}</td>
      <td>{{ x.firstname }}</td>
      <td>{{ x.lastname }}</td>
    </tr>
  {% endfor %}
</table>

</body>
</html>
views.py

from django.http import HttpResponse
from django.template import loader
from .models import Member

def testing(request):
  mydata = Member.objects.filter(firstname='Emil').values() | Member.objects.filter(firstname='Tobias').values()
  template = loader.get_template('template.html')
  context = {
    'mymembers': mydata,
  }
  return HttpResponse(template.render(context, request))
      


# Check out template.html to see how the mymembers object
# was used in the HTML code.    

위의 코드를 실행하면 아래 그림과 같다.

 

또 다른 일반적인 방법은 Q 식을 가져와 사용하는 것이다:

이름이 "Emil" 또는 "Tobias"인 경우 레코드를 반환한다:

template.html

<!DOCTYPE html>
<html>
<body>

<p>The queryset object:</p>

{{ mymembers }}

<p>Loop through the items:</p>

<table border='1'>
  <tr>
    <th>ID</th>
    <th>Firstname</th>
    <th>Lastname</th>
  </tr>
  {% for x in mymembers %}
    <tr>
      <td>{{ x.id }}</td>
      <td>{{ x.firstname }}</td>
      <td>{{ x.lastname }}</td>
    </tr>
  {% endfor %}
</table>

</body>
</html> 
views.py

from django.http import HttpResponse
from django.template import loader
from .models import Member
from django.db.models import Q

def testing(request):
  mydata = Member.objects.filter(Q(firstname='Emil') | Q(firstname='Tobias')).values()
  template = loader.get_template('template.html')
  context = {
    'mymembers': mydata,
  }
  return HttpResponse(template.render(context, request))
        


# Check out template.html to see how the mymembers object
# was used in the HTML code. 

위의 코드를 실행하면 아래 그림과 같다.

파이썬 Django QuerySet or Q 문 활용 예제

 

SQL에서 위의 문장은 다음과 같이 적는다:

SELECT * FROM members WHERE firstname = 'Emil' OR firstname = 'Tobias';

 

파이썬 Django QuerySet 필드 조회(Field Lookup) : __startswitch

Django는 SQL 문과 WHERE 절을 지정하는 고유한 방법이 있다.

Django의 절 위치를 구체적으로 알려면 "Field lookup"을 사용한다.

필드 룩업은 특정 SQL 키워드를 나타내는 키워드이다.

키워드로 __startswitch를 사용한다:

.filter(firstname__startswith='L');

 

SQL 문은 아래와 같다.:

WHERE firstname LIKE 'L%'

위 문은 이름이 'L'로 시작하는 레코드를 반환한다.

 

파이썬 Django QuerySet 필드 조회 구문(Filed Lookup syntax)

모든 필드 룩업 키워드는 필드 이름, 두 개(!)의 밑줄 문자 및 키워드를 사용하여 지정해야 한다.

당사의 member 모델에서 진술은 다음과 같이 작성된다:

이름이 'L'자로 시작하는 레코드를 반환한다:

template.html

<!DOCTYPE html>
<html>
<body>

<p>The queryset object:</p>

{{ mymembers }}

<p>Loop through the items:</p>

<table border='1'>
  <tr>
    <th>ID</th>
    <th>Firstname</th>
    <th>Lastname</th>
  </tr>
  {% for x in mymembers %}
    <tr>
      <td>{{ x.id }}</td>
      <td>{{ x.firstname }}</td>
      <td>{{ x.lastname }}</td>
    </tr>
  {% endfor %}
</table>

</body>
</html> 
views.py

from django.http import HttpResponse
from django.template import loader
from .models import Member

def testing(request):
  mydata = Member.objects.filter(firstname__startswith='L').values()
  template = loader.get_template('template.html')
  context = {
    'mymembers': mydata,
  }
  return HttpResponse(template.render(context, request))
      


# Check out template.html to see how the mymembers object
# was used in the HTML code.

위의 코드를 실행하면 아래 그림과 같다.

파이썬 Django QuerySet 필드 조회 구문 활용 예제

 

파이썬 Django QuerySet 필드 조회 참조

키워드 설명
contains 문구를 포함합니다
icontains 포함된 것과 동일하지만 대소문자 구분 없음
date 날짜와 일치합니다
day 날짜(월요일, 1-31)와 일치합니다(날짜의 경우)
endswith 끝은 다음과 같습니다
iendswith 끝은  동일하지만 대소문자 구분 없음
exact 정확한 일치
iexact 정확하지만 대소문자 구분이 없습니다
in 값 중 하나와 일치합니다
isnull NULL 값과 일치합니다
gt 보다 큼
gte 보다 크거나 같다.
hour 시간(날짜 시간)과 일치합니다
lt 보다 작음
lte 보다 작거나 같다.
minute 분(날짜 시간)과 일치합니다
month 달(날짜의 경우)과 일치합니다
quarter 1년 중 4분의 1(1-4일)과 일치합니다(날짜의 경우)
range 사이의 일치
regex 정규식과 일치합니다
iregex regex와 동일하지만 대소문자 구분 없음
second 초(데이트 시간)와 일치합니다
startswith 시작과 일치하는지
istartswith 처음과 동일하지만 대/소문자 구분 없음
time 시간(날짜 시간)과 일치합니다
week 주 번호(1-53)와 일치합니다(날짜의 경우)
week_day 일치하는 요일(1-7) 1은 일요일입니다
iso_week_day ISO 8601 요일(1-7) 1이 월요일과 일치합니다
year 년 일치(날짜의 경우)
iso_year ISO 8601년(날짜의 경우)과 일치합니다

 

이번 글에서는 파이썬 Django QuerySet filter와 관련해서 살펴보았다.

파이썬 Django QuerySet filter() 메소드에 다양한 옵션으로 and, or, 필드 조회로 __startswith 키워드 등에 대해서 실습하였다.

꼭 손으로 눈으로 머리로 익히며 실습하기를 바란다.
모두 화이팅입니다.!!!

출처 : 이 글의 출처는 w3schools사이트를 참고하였으며 필자가 추가하여 정리한 글입니다.

반응형

댓글