[Django] Django QuerySet API

김가람휘·2022년 2월 10일
0

Django

목록 보기
4/13
post-thumbnail

1. Django QuerySet API

  • django에서는 Django Model이 ORM이다.
  • Model Manager : 데이터베이스 질의 인터페이스를 제공한다. 이를 통해 해당 모델 클래스의 DB 데이터를 추가, 조회, 수정, 삭제(CRUD) 가능하다.
  • Model method == QuerySet method
  • 쿼리(Query) : 데이터베이스에게 특정한 데이터를 보여달라는 클라이언트(사용자)의 요청을 말한다.
    -> Python으로 작성한 코드가 SQL로 mapping되어 QuerySet 이라는 자료형태로 값이 넘어오게 된다.
  • 쿼리셋(QuerySet) : 데이터베이스에서 전달받은 객체들의 모음(list)을 말한다.
    • Django ORM에서 발생한 자료형
    • Python에서 읽고 쓰기 위해 자료형 변환을 해줘야 한다.
    • lazy하다 -> 쿼리셋은 미리 데이터베이스에 접근해서 값을 불러오는 것이 아니라 출력 등과 같이 필요한 순간에 sql로 매핑되어 데이터베이스에 접근해서 값을 가져옵니다.

      ORM(Object-Relational Mapping)

      • 객체와 관계형 데이터베이스의 데이터를 매핑(Mapping)해주는 것을 의미한다. -> 하나의 값을 다른 값으로 대응시키는 것
      • 객체 간의 관계를 바탕으로 SQL을 자동 생성하여 sql쿼리문 없이도 데이터베이스의 데이터를 다룰 수 있게 해준다.
      • 데이터베이스의 테이블을 객체지향 프로그래밍에서 흔히 사용하는 객체(Class)처럼 사용할 수 있도록 해주는 기술이다.
      • 기존 쿼리문을 작성하여 데이터베이스를 조작하는 것을 넘어서서 더 효율적이고 가독성 및 유지 보수에 적합한 코드를 만들기 위해 나온 기술이다.

2. QuerySet 반환되는 경우 vs 반환되지 않는 경우

  • Model method의 실행 결과는 QuerySet을 반환하거나 그렇지 않은 경우가 있습니다.

2-1. QuerySet 반환되는 경우

  • <QuerySet [<Category: Category object (1)>, <Category: Category object (2)>]>
  • all()

    • 한 테이블의 모든 레코드를 가져옵니다.
    • 그 결과로 QuerySet을 반환합니다. 이때, QuerySet안에는 각각 인스턴스가 포함되어 있습니다.
In : Category.objects.all()
Out : <QuerySet [<Category: Category object (2)>, <Category: Category object (3)>, <Category: Category object (4)>, <Category: Category object (5)>, <Category: Category object (6)>, <Category: Category object (7)>]>

In : for category in Category.objects.all()
print(category.name)

#아래와 같이 인스턴스들이 담겨 있는 QuerySet이 반환되기 때문에, 모든 속성에 접근해서 데이터를 관리할 수 있습니다.
Out : 티
브루드커리
브루드커피
콜드브루
콜드브루
  • filter() & exclude()

    • 한 테이블의 특정 레코드를 가져오려면 필터를 사용할 수 있다.
    • filter(**kwargs) : 키워드 인자로 주어진 lookup 조건에 일치하는 레코드들의 QuerySet을 반환한다.
# case1
In : Category.objects.filter(name='브루드커피')
Out : [<Category: Category object (3)>, <Category: Category object (4)>]

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

# case3
In : Category.objects.filter(name='브루드커피').exclude(id=3)
Out : [<Category: Category object (4)>]
  • values()

    • iterable로 사용될 때 모델 인스턴스가 아닌 dictionary를 포함하는 QuerySet을 반환합니다.
In : Category.objects.filter(name='브루드커피')
Out : [<Category: Category object (3)>, <Category: Category object (4)>]

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

    • dictionary를 반환하는 대신 반복 될 때 튜플을 반환합니다.
In : Category.objects.filter(name='브루드커피').values_list()
Out : <QuerySet [(3, '브루드커피'), (4, '브루드커피')]>

2-2. QuerySet 반환되지 않는 경우

  • <Category: Category object (1)> , 9 , True ..
  • create()

    • Table에 데이터를 추가(INSERT) 해주는 method로, 생성된 인스턴스를 반환해준다.
In : Category.objects.create(name='콜드브루')
Out : <Category: Category object (1)>

#category 변수에 반환된 값을 저장하고, 생성된 data를 사용할 수 있다.
#인스턴스로 반환되므로 category.name으로 class 안에 변수에 접근할 수 있다.
In : category = Category.objects.create(name='콜드브루')
In : category.name
Out : '콜드브루'

참고) save method : INSERT 또는 UPDATE
Category(name='콜드브루').save()
  • get()

    • 지정된 조회 매개 변수와 일치하는 인스턴스를 반환합니다.
    • 이 매개 변수는 필드 조회에 설명 된 형식이어야합니다.
In : Category.objects.get(id=1)
Out : <Category: Category object (1)>
  • update()

    • 지정된 필드에 대해 업데이트 쿼리를 수행하고 일치하는 행 수를 반환한다. (일부 행에 이미 새 값이 있는 경우 업데이트된 행 수와 같지 않을 수 있다.)
In : Category.objects.filter(name='탄산').update(name='콜드브루')
Out : 2 #총 업데이트된 row 개수
  • delete()

    • QuerySet의 모든 행에 대해 SQL 삭제 쿼리를 수행하고 삭제 된 개체 수와 개체 유형별 삭제 횟수가 있는 dictionary를 반환합니다.
In : Category.objects.filter(name='qp').delete()
Out : (1, {'products.Category': 1})
  • save()

    • INSERT 또는 UPDATE를 수행하는 method로, 단일 객체에 대해서 업데이트를 수행할 때 많이 사용됩니다.
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()

    • filter()와 함께 사용해서 filter 조건에 맞는 데이터가 있는지 조회, 존재하면 True 존재하지 않으면 False를 반환한다.
In : Category.objects.filter(name='브루드커피').exists()
Out : True
  • get_or_create()

    • (object, created) 라는 튜플 형식으로 반환합니다.
    • object는 꺼내려고 하는 모델의 인스턴스입니다.
    • created는 boolean flag로, get_or_create()에 의해 인스턴스가 생성되었다면 TRUE 데이터베이스에 존재하던 인스턴스라면 FALSE를 갖고 있다.
  • bulk_create()

    • 객체 목록이 얼마나 많은지 상관없이 한번에 효율적으로 데이터베이스에 삽입합니다.
  • count()

    • 일치하는 데이터베이스의 개체 수를 나타내는 정수를 반환합니다.
  • first()

    • 쿼리셋과 일치하는 첫 번째 개체를 반환하거나 일치하는 개체가 없는 경우 None을 반환합니다.
    • 순서가 정의되지 않은 경우 쿼리셋은 기본 키로 자동으로 순서가 지정됩니다.
  • last()

    • first()처럼 작동하지만 쿼리셋의 마지막 개체를 반환합니다.
  • aggregate()

    • 합계, 카운트, 평균, 최대값, 최소값을 계산하여 dictionary형으로 반환합니다.

0개의 댓글