티스토리 뷰

QuerySet?

쿼리 셋은 데이터베이스로부터 전달받은 객체의 목록(list)이다. 

또한, 쿼리셋은 lazy 하기 때문에 생성 작업을 할 때에는 데이터 베이스에서 데이터를 가져오지 않는다고 한다.

>>> q = Entry.objects.filter(headline__startswith="What")
>>> q = q.filter(pub_date__lte=datetime.date.today())
>>> q = q.exclude(body_text__icontains="food")
>>> print(q)
# 장고의 쿼리셋은 위 pritn문에서 데이터베이스에 들어가 데이터를 가져온다.
# 이전 작업에서는 데이터베이스에서 정보를 가져오지 않는다.

 

★ queryset을 살펴보기 전에 데이터 베이스를 살펴보자

데이터 베이스에는 column()과 row()가 있고 각 column에 맞는 row에 데이터가 저장된다.

각 class에 정의해둔 속성 값이 column값이며 row에 해당되는 부분은 각 속성에 들어가는 값이다.

key값에 따른 value값이 들어가기 때문에 딕셔너리로 저장된다. 

 

예시)

# models.py

class Actor(models.Model):
   # colunm   = row   (값이 들어가는곳)
    first_name = models.CharField(max_length = 50)
    last_name = models.CharField(max_length = 50)
    date_of_birth = models.IntegerField()class Actor(models.Model):
	
    
# mysql에서 Actors 테이블을 살펴보자

mysql> select * from actors;

# column (세로)
+----+------------+-----------+---------------+
| id | first_name | last_name | date_of_birth | 
+----+------------+-----------+---------------+
|  1 | 해일        | 박         |      19770126 | # row (가로)
|  2 | 웨이        | 탕         |      19791007 |
|  3 | 정현        | 이         |      19800207 |
|  4 | 경표        | 고         |      19900611 |
|  5 | 은빈        | 박         |      19920904 |
|  6 | 교환        | 구         |      19821214 |
+----+------------+-----------+---------------+

 

QuerySet으로 반환되는 경우

클래스 이름. objects.all()

데이터의 테이블을 모두 가져오며  queryset(리스트)으로 반환한다. 따라서 <변수 명>[index]으로 접근이 가능하다.

>>> Actor.objects.all()
<QuerySet [<Actor: Actor object (1)>, <Actor: Actor object (2)>,
<Actor: Actor object (3)>, <Actor: Actor object (4)>, <Actor: Actor object (5)>,
<Actor: Actor object (6)>, <Actor: Actor object (7)>, <Actor: Actor object (8)>]>

>>> a=Actor.objects.all()
# index로 접근이 가능함
>>>a[0]
<Actor: Actor object (1)>

클래스 이름. objects.values()

queryset (리스트 형태) 전체를 불러오며, Actor 클래스에 정의되어있는 내용을 딕셔너리 형태로 반환해주기 때문에

<변수 명>[index]['key]로 value값에 접근이 가능하다.

Actor.objects.values()

<QuerySet [{'id': 1, 'first_name': '해일', 'last_name': '박', 'date_of_birth': 19770126},
{'id': 2, 'first_name': '웨이', 'last_name': '탕', 'date_of_birth': 19791007},
{'id': 3, 'first_name': '정현', 'last_name': '이', 'date_of_birth': 19800207},
{'id': 4, 'first_name': '경표', 'last_name': '고', 'date_of_birth': 19900611}, 
{'id': 5, 'first_name': '은빈', 'last_name': '박', 'date_of_birth': 19920904},
{'id': 6, 'first_name': '교환', 'last_name': '구', 'date_of_birth': 19821214}]>

# 먼저 변수에 넣음
a = Actor.objects.values() 
a[0]['first_name']
'해일'

클래스 이름. objects.values_list()

. values_list()는. values()와 다르게 key, value 형태의 딕셔너리가 아닌 튜플 형태의 리스트를 가져온다.  value 값만 전달

# values() 딕셔너리 형태의 리스트
>>> Actor.objects.filter(last_name='박').values()
<QuerySet [{'id': 1, 'first_name': '해일', 'last_name': '박', 'date_of_birth': 19770126},
{'id': 5, 'first_name': '은빈', 'last_name': '박', 'date_of_birth': 19920904},
{'id': 8, 'first_name': '해일', 'last_name': '박', 'date_of_birth': 19791007}]>

# values_list() 튜플 형태의 리스트
>>> Actor.objects.filter(last_name='박').values_list()
<QuerySet [(1, '해일', '박', 19770126), (5, '은빈', '박', 19920904), (8, '해일', '박', 19791007)]>

클래스 이름. objects.filter() - 자주 사용하는 기능!

장고에서 테이블을 조회할 때 filter를 사용하여 검색 조건(키워드 인자 **kwargs)에 따라 속하는 데이터만 조회하여 queryset으로 반환한다. 

 

필터 연결이 가능 (chaining filter)

다른 함수들과 연결하여 사용할 수 있으며, filter()와 자주 사용되는 함수는 exists()가 있다.

# 클래스명.objects.filter(first_name= '해일')
# 클래스명.objects.filter(id=1)

>>> Actor.objects.filter(first_name ='해일')
<QuerySet [<Actor: Actor object (1)>]>

# 검색 조건에 일치하는 값이 없으면 빈 queryset을 반환한다
>>> Actor.objects.filter(first_name='해일', id = 4)
<QuerySet []>

# 다른 함수들과 연결하여 사용할 수 있다
>>> a = Actor.objects.filter(last_name='박').exclude(first_name='박')
<QuerySet [<Actor: Actor object (1)>, <Actor: Actor object (5)>, <Actor: Actor object (8)>]>

# exists()는 filter 조건에 부합하는 데이터가 있으면 True을 반환한다
>>> a = Actor.objects.filter(last_name='박').exists()
True

클래스 이름. objects.exclude()

. exclude( 검색 조건 ) 검색 조건(키워드 인자 **kwargs)에 넣은 값을 제외한 값들이 queryset으로 출력된다.

클래스명.objects.exclude(id=1, id=2)

>>> Actor.objects.exclude(id=1)
<QuerySet [<Actor: Actor object (2)>, <Actor: Actor object (3)>, 
<Actor: Actor object (4)>]>

클래스 이름. objects.get()

. get()은 딕셔너리 요소 하나를 반환하며, 해당 조건의 요소가 0일 때 DoseNotExits 에러가, 2개 이상 존재할 때 MultipleObjectsReturned 에러가 발생한다.

하나의 객체를 반환하기 때문에, 먼저 특정 조건의 정보를 변수에 저장 후  <변수명>. 키값(?)으로 접근이 가능하다.

# get(id=1)은 id=1인 요소의 전부를 가져옴
>>> Actor.objects.get(id=1)
<Actor: Actor object (1)>

# a1에 id=1인 쿼리셋을 저장
>>> a1=Actor.objects.get(id=1)
# id=1 인 a1의 키값last_name을 불러옴
>>> a1.last_name
'박'

# 중복되는 값이 여러개 존재할 경우
>>> Actor.objects.get(last_name='박')
# 중복되는 값이 있기 때문에 MultipleObjectsReturned 발생
MultipleObjectsReturned: get() returned more than one Actor -- it returned 3!

# 중복되는 값이 존재하지 않는 경우
>>> Actor.objects.get(last_name='후')
# 찾는 값이 없기 때문에 DoesNotExist 발생
DoesNotExist: Actor matching query does not exist.

클래스 이름. objects.last()

해당 데이터 테이블의 마지막 데이터를 가져온다.

>>> Actor.objects.last()
<Actor: Actor object (8)>

 

→ 더 많은 자료는 장고에서 확인해보기 


내용 전문 및 출처 - Django

'study > Django' 카테고리의 다른 글

Django - 회원 로그인 구현  (0) 2022.07.10
Django - 회원가입 구현  (0) 2022.07.10
Django - MtoM Field 없이 구현  (0) 2022.07.06
westarbucks 만들기 - models.py  (0) 2022.07.05
Django tutorial 따라하기 4  (0) 2022.06.30
댓글