Django QuerySet API

SungjoonAn·2022년 2월 13일
0

Django

목록 보기
3/12
post-thumbnail

What is API?

API는 Application Programming Interface의 약자로, 응용 프로그램에서 운영체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있도록 만든 인터페이스를 의미한다.

QuerySet API는 QuerySet을 만들고 가공하는 데 사용할 수 있는 명령어라 생각하면 된다. 그렇다면 QuerySet은? 핵심을 집어서 이야기하자면, QuerySet은 전달받은 모델의 객체 목록입니다. Queryset은 DB로부터 데이터를 읽고, 필터를 걸거나 정렬을 할 수 있습니다. 그렇기 때문에 django의 ORM인 django 모델을 sql문으로 만들어준다.

QuerySet API에서 제공하는 자주 사용되는 Model method 에 대해 알아보겠습니다.

Model method 종류
all() , filter() , exclude() , values() , values_list()
get() , create() , count() , exists() , update() , delete() , first() , last()

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

QuerySet 반환되는 경우

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

1. all()
한 테이블의 모든 레코드를 가져오려면 아래와 같이 all() method를 사용합니다. 그 결과로 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 : 티
브루드커리
브루드커피
콜드브루
콜드브루

2. filter() & exclude()
한 테이블의 특정 레코드를 가져오려면 필터를 사용할 수 있다. filter() method는 가장 자주 사용하는 필터 기능이다. 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)>]

3. 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': '브루드커피'}]>

4. values_list()
values_list() method는 dictionary를 반환하는 대신 반복 될 때 튜플을 반환한다는 점을 제외하면 values ()와 유사합니다. 각 튜플에는 values_list () 호출에 전달 된 각 필드 또는 표현식의 값이 포함되어 있으므로 첫 번째 항목이 첫 번째 필드입니다.

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

QuerySet 반환되지 않는 경우

<Category: Category object (1)> , 9 , True

1. 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()

2. get()
지정된 조회 매개 변수와 일치하는 인스턴스를 반환합니다.이 매개 변수는 필드 조회에 설명 된 형식이어야합니다.

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

3. 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})

4. 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'

5. exists()
filter()와 함께 서용해서 filter 조건에 맞는 데이터가 있는지 조회, 존재하면 True 존재하지 않으면 False를 반환한다.

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

6. Additional methods
get_or_create(), bulk_create(), count(), first(), last(), aggregate()

Django Shell

Django가 지원되는 python prompt, 바로 django shell로 접속해서 사용가능하다. Django shell은 python의 모든 명령어 + django의 기능까지도 사용할 수 있는 곳이다. 여기서 ORM, queryset을 다뤄볼 수 있다. 이제 django shell에 접속해있으면,
djagno의 명령어들로 django 모델(객체)를 조작할 수 있다.

  • Django Shell 을 더욱 깔끔하게 만들어 사용하고자 하면, 하단의 라이브러리를 설치해야한다.
pip install ipython
  • Model
from django.db import models

class Category(models.Model):
    name = models.CharField(max_length=20)

0개의 댓글