장고 에서 쿼리셋 이란?

엄재홍·2022년 4월 19일
0

쿼리셋 : 전달 받은 모델에 있는 객체의 목록을 말하며 데이터베이스에 접근하여 데이터를 생성, 수정, 삭제 할수있고 필터를 걸어서 원하는 키의 값을 찾아내거나 정렬하거나 데이터를 읽어낼수있다.

여러가지 쿼리셋 모델 메서드 가 있는데 그 중에서 쿼리셋을 반환하는 것들 과 쿼리셋을 반환하지 않는 것들로 나누어 보겠다

쿼리셋을 반환 하는 메서드 는 대표적으로 all(), filter(), values(), value_list() 가 있다.

all은 참조할 테이블명.objects.all() 이라고 하면 선언한 테이블에 있는 모든 레코드를 가져온다. Ex. 쿼리셋 {<모델명> 모델명 object (id값)} - 쿼리셋 안에 각각의 인스턴스가 담겨서 나온다.

Out : <QuerySet [<Category: Category object (2)>, <Category: Category object (3)>,

Filter 는 가장 자주 사용하는 메서드로서 테이블명.objects.filter(원하는 값에대한 조건) 이라고 하면 filter메소드안의 선언한 속성에 맞는 특정 레코드를 쿼리셋 형태로 가져온다.

In : Category.objects.filter(name='브루드커피')
Out : [<Category: Category object (3)>, <Category: Category object (4)>]

values()는 filter와 비슷하지만 반환하는 형태가 다르다. 쿼리셋에 딕셔너리 형태로 {id : 값, ‘name’ : ~~, } 이런식으로 좀 더 자세하게 반환해준다. 반환 되는 값은 메서드 안의 속성 값에 맞춰서 반환된다. Ex. 속성에 name = “” 라고 하면 그대로 반환값에도 적용된다.

In : Category.objects.filter(name='브루드커피')
Out : [<Category: Category object (3)>, <Category: Category object (4)>]

value_list는 value 와 비슷하지만 반환되는 형태가 튜플로 반환 된다.

EX.
In : Category.objects.filter(name='브루드커피').values_list()
Out : <QuerySet [(3, '브루드커피'), (4, '브루드커피')]>  

쿼리셋을 반환하지 않는 메서드는 대표적으로
create(), get(), updata(), delete(), save(), exists() 가 있다.

create() 는 테이블에 레코드를 작성하는 메서드로서 생성된 인스턴스를 반환해준다.

get() 메서드는 create로 저장된 레코드를 선언한 조건에 맞춰 가져오는 메서드 이다. 선언한 조건에 일치하는 인스턴스를 반환한다.

겟 .컬럼명 하면 겟에서 가져오는 row값에서 원하는 컬럼을 뽑을수잇다

Out : <Category: Category object (1)> (인스턴스 반환 형식)

update() 는 지정된 테이블에 filter, 조건을 걸어 말 그대로 업데이트(수정)을 하고 수정된 행 수를 갯수를 반환한다.


In : Category.objects.filter(name='탄산').update(name='콜드브루')
Out : 2 #총 업데이트된 row 개수

delete() 는 지정한 테이블에 지정된 조건에 일치하는 레코드를 삭제 하고 삭제한 테이블의 위치 및 갯수를 반환해준다.


In : Category.objects.filter(name='qp').delete()
Out : (1, {'products.Category': 1})

save() 는 단순히 저장해주는 메서드가 아니라 테이블의 레코드를 객체로 지정하고 그것을 저장 하는 메서드이다.

In : category = Category.objects.get(id=2)
Out : <Category: Category object (2)>

In : category.name
Out : '브루드커피'

In : category.name = 'new name'
In : category.save()

In : category.name
Out : 'new name'

exists() 메서드는 지정한 테이블의 지정한 조건에 맞는 레코드들이 존재하는지 아닌지 여부를 boolean 값으로 반환해주는 메서드이다. Filter 메서드를 이용해 지정한 조건의 레코드가 있는지 없는지, 없다면 어떻게 할것인지 지정해줌으로써 유용하게 활용된다.

In : Category.objects.filter(name='브루드커피').exists()
Out : True

이러한 쿼리셋은 파이썬에서 읽고 쓸수 없기에 우리는 모델이든 뷰에서 리스트, 딕셔너리로 변경하여 객체로 지정해서 원하는 값을 얻을수있다.

profile
유비무환. 고로 준비합시다.

0개의 댓글