[django] QuerySet API

ㅎㅎ·2021년 6월 23일
1

django

목록 보기
8/8

📌django QuerySet method

  • django의 QuerySet API는 데이터 작업을 위한 포괄적인 메소드를 제공한다.

  • django에서 자주 사용하는 Model method, 정확하게 말해서 QuerySet Method의 실행 결과는 쿼리셋을 반환하거나 그렇지 않은 경우가 존재한다.

  • 쿼리셋을 반환하는 경우
    <QuerySet [<Category: Category object (1)>, <Category: Category object (2)>]>

  • 쿼리셋을 반환하지 않는 경우
    <QuerySet [<Category: Category object (1)>, <Category: Category object (2)>]>

  • 종류 :all(), filter(), exclude(), values(), values_text(), get(), create(), count(), exitst(), update(), delete(),first(), last(),,,, etc

쿼리셋을 반환하지 않는 메소드들

  • 만약 이런 모델의 class가 존재한다면,
class Menu(models.Model):
    name = models.CharField(max_length=20) #db 필드, column
    class Meta:
        db_table = 'menus' # 테이블 이름 - 소문자,복수형으로

- create()

: 테이블에 데이터를 추가해주는 method로, 생성된 인스턴스를 반환한다.

>>> m1 = Menu.objects.create(name="빵")
>>> m1
<Menu: Menu object (18)> #생성된 인스턴스 반환

#변수에 저장된 인스턴스를 이용해 class안의 변에 접근할 수 있다. 
>>> m1.name 
'빵'

- get()

: 지정된 조회 매개 변수와 일치하는 인스턴스를 반환한다. 이 때 매개 변수는 필드 조회에 설명 된 형식이어야 한다.

>>> m2 = Menu.objects.get(id=1)
>>> m2
<Menu: Menu object (1)>

-update()

:지정된 필드에 대해 업데이트를 수행하고 일치하는 행 수를 반환다.

>>> Menu.objects.filter(name='기타').update(name='etc')
1  #총 업데이트된 row개수
>>> Menu.objects.filter(name='카드').update(name='상품권')
1

-delete()

: 쿼리셋 모든 행에 대해 삭제 쿼리를 수행하고, 삭제된 개체수와 유형별 삭제 횟수가 있는 딕셔너리를 반환한다.

>>>Menu.objects.filter(name="빵").delete()
(1, {'products.Menu': 1})
>>> Menu.objects.filter(name="음료").delete()
(27, {'products.Image': 4, 'products.Allergyproduct': 5, 'products.Product': 5, 'products.Category': 7, 'products.Menu': 6})

- save()

: insert or update를 수행하는 메소드로, 단일 객체에 대해 업데이트를 수행할때 많이 사용한다 .

>>> m3 = Menu.objects.get(id=2) #id가 2인 인스턴스를 가져와
>>> m3
<Menu: Menu object (2)>
>>> m3.name # 그 인스턴스의 변수(이름)을 확인 
'푸드'
>>> m3.name = "음료" # 푸드-> 음료로 변경
>>> m3.save() # 저장
>>> m3
<Menu: Menu object (2)>
>>> m3.name # 변경 확인
'음료'

- exists()

: filter()을 함께 사용해 조건에 맞는 데이터가 있는지 조회한다. 있으면 True 없으면 False를 반환한다.

>>> Menu.objects.filter(name="음료").exists()
True

그리고 더 많은 메소드들,,,,,
get_or_create(), bulk_create(), count(), first(), last,aggregate()

쿼리셋을 반환하는 메소드들

- all()

:한 테이블의 모든 레코드를 가져올 때 사용한다. 그리고 결과로 쿼리셋을 반환한다. 그리고 각 쿼리셋 안에는 각각 인스턴스가 포함되어 있다.
,

>>> Menu.objects.all()
<QuerySet [<Menu: Menu object (2)>, <Menu: Menu object (4)>, <Menu: Menu object (12)>]> 

#쿼리셋안에 있는 인스턴스 하나씩 가져오기 
>>> menus = Menu.objects.all()
>>> for menu in menus:
...     print(menu.name) #인스턴스의 속성에 접근 가능해 데이터를 관리할 수 있음. 
...
음료
상품권
etc

- filter() & exclude()

: filter(**kwargs) 키워드 인나로 주어진 조건에 일치하는 레코드들의 쿼리셋을 반환한다. exclude()는 그 조건에 해당하는 레코드들을 제외한 쿼리셋을 반환한다.

>>> Menu.objects.filter(name="음료").filter(id=2)
<QuerySet [<Menu: Menu object (2)>]>

>>> Menu.objects.filter(name="음료").exclude(id=2)
<QuerySet []>

- values()

: iterable로 사용될 때 모델 인스턴스가 아닌 딕셔너리를 포함하는 쿼리셋을 반환한다.

>>> Menu.objects.filter(name="음료")
<QuerySet [<Menu: Menu object (2)>]>  #쿼리셋 반환

>>> Menu.objects.filter(name="음료").values()
<QuerySet [{'id': 2, 'name': '음료'}]> 

- values_list()

: values() 동일하지만 딕셔너리가 아닌 튜플을 포함하는 쿼리셋을 반환한다. 각 필드 또는 표현식의 갑싱 포함되어 있으므로 첫번째 항목이 첫 번째 필드이다.

>>> Menu.objects.filter(name="음료").values_list()
<QuerySet [(2, '음료')]>

0개의 댓글