찰리의 놀이터

[Django] 쿼리셋(QuerySet) 객체별 접근 방식 본문

DataBase

[Django] 쿼리셋(QuerySet) 객체별 접근 방식

차알리 2023. 5. 4. 11:08

Queryset이란?

ORM으로 연결된 DB에서 전달받은 리스트 형태의 객체입니다.
DB에서는 row(행)에 해당하는 값이 넘어옵니다.
Python으로 작성한 코드가 SQL로 매핑되어 Queryset이라는 자료의 형태로 값이 넘어옵니다.

하위 코드들은 DB에 저장된 모든 객체를 불러오지만 실제로 DB에 query가 이루어지진 않습니다.

 

"왜 실제 DB에 쿼리가 적용되지 않는거죠?"

Queryset의 lazy한 특성 때문인데, 실제로 데이터를 가져오는 행위(fetch)를 실행하려면 QuerySet을 iterate 시켜야합니다.
즉, 반복문을 통해 print로 출력을 하는 식으로 진행해야 적용이 된다는 뜻입니다.

for board in board_list:
    print(board.username)

 

객체별 접근방식

Django의 클래스 내부에서 정의하는 속성은 DB의 Column에 해당하고, 각 속성에 부여되는 값은 Row에 해당합니다.
QuerySet 내부의 객체에 접근할 때, 값(value)에 접근하는지, 속성(attribute)에 접근하는지에 따라 접근 방식에 차이가 있습니다.

 

ClassName.objects.values()

  • .values()로 Dictionary의 key/value에 접근이 가능합니다.
  • QuerySet()은 리스트, 객체는 Dictionary 형태입니다. 따라서 <variable_name>[index]['key']의 방식으로 value 값에 적응이 가능합니다.

 

ClassName.objects.get()

  • get()은 하나의 Dictionary 요소를 반환합니다.
    • 필드명=조건값을 입력할 경우 해당 조건에 맞는 데이터를 불러옵니다.
  • 해당 조건의 요소가 존재하지 않은 경우 DoesNotExist, 여러 개가 존재하는 경우 MultipleObjectsReturned 에러가 발생합니다.
  • 하나의 객체가 반환되기 때문에 dot notation으로 접근이 가능합니다. <variable_name>.name

 

ClassName.objects.filter()

  • filter()는 주어진 파라미터에 따라 쿼리 결과를 필터링하여 리스트로 반환합니다.
  • 필드명=조건값이 들어가며 2개 이상의 조건을 넣을 경우, AND 연산이 수행됩니다.
  • OR 연산으로 두 조건을 통해 쿼리 결과를 받고 싶으시다면 Q를 사용하면 됩니다.
from django.db.models import Q

Item.objects.filter(Q(title="제목") | Q(content="내용"))

 

ClassName.objects.all()

  • all()은 QuerySet안의 모든 객체를 리스트 형태로 반환합니다.