[C.R.U.D] Django QuerySet API

제갈창민·2021년 11월 24일
0

learningbook

목록 보기
22/32

1. Django QuerySet API

  • Django의 QuerySet API는 자체적으로 데이터 작업을 위한 포괄적인 메서드를 제공함

2. 자주 사용되는 Model Method

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

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

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

3-1. QuerySet 이 반환되는 경우

  • all() :
    한 테이블의 모든 레코드를 가져오려면 아래와 같이 all() method를 사용함
    그 결과로 QuerySet 을 반환하고, QuerySet 안에는 각각 인스턴스가 포함되어 있음
    In  : Category.objects.all()
    Out : <QuerySet [<Category: Category object (2)>, <Category: Category object (3)>, ...]>
    In  : for category in Category.objects.all()
	  print(category.name)
    "아래와 같이 인스턴스들이 담겨 있는 QuerySet이 반환되기 때문에, 모든 속성에 접근해서 데이터를 관리할 수 있음"
    Out : 티
          브루드커피
          콜드브루
          프라푸치노
  • filter() & exclude() :
    한 테이블의 특정 레코드를 가져오려면 filter를 사용할 수 있음. filter() method는 가장 자주 사용하는 필터 기능 중 하나이다.
    -> filter(**kwargs) : 키워드 인자로 주어진 lookup 조건에 일치하는 레코드들의 QuerySet을 반환한다.
    **case-1-**
    In  : Category.objects.filter(name='브루드커피')
    Out : [<Category: Category object (3)>, <Category: Category object (4)>]
    
    **case-2-**
    In  : Category.objects.filter(name='브루드커피').filter(id=3)
    Out : [<Category: Category object (3)>]
    
    **case-3-**
    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': '브루드커피', 
		    'created_at': datetime.datetime(2020, 9, 8, 5, 43, 30, 4068, tzinfo=<UTC>), 
		    'updated_at': datetime.datetime(2020, 9, 8, 5, 43, 30, 21801, tzinfo=<UTC>)}, 
		    {'id': 4, 'name': '브루드커피', 
		    'created_at': datetime.datetime(2020, 9, 8, 5, 43, 30, 4068, tzinfo=<UTC>), 
		    'updated_at': datetime.datetime(2020, 9, 8, 5, 43, 30, 21801, tzinfo=<UTC>)}]>

  • values_list() :
    values_list() method는 dictionary를 반환하는 대신, 반복 될 때 튜플을 반환한다는 점을 제외하면 values ()와 유사함.
    각 튜플에는 values_list() 호출에 전달 된 각 필드 또는 표현식의 값이 포함되어 있으므로 첫 번째 항목이 첫 번째 필드이다.
    In  : Category.objects.filter(name='브루드커피').values_list()
    Out : <QuerySet [(3, '브루드커피', datetime.datetime(2020, 9, 8, 5, 43, 30, 4068, tzinfo=<UTC>), 
		      datetime.datetime(2020, 9, 8, 5, 43, 30, 21801, tzinfo=<UTC>)), 
		     (4, '브루드커피', datetime.datetime(2020, 9, 8, 5, 43, 30, 4068, tzinfo=<UTC>),
		      datetime.datetime(2020, 9, 8, 5, 43, 30, 21801, tzinfo=<UTC>))]>

3-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
  • Additional methods
    • get_or_create()
    • bulk_create()
    • count()
    • first()
    • last()
    • aggregate()
profile
자기계발 중인 신입 개발자

0개의 댓글