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 Menu(models.Model):
name = models.CharField(max_length=20) #db 필드, column
class Meta:
db_table = 'menus' # 테이블 이름 - 소문자,복수형으로
: 테이블에 데이터를 추가해주는 method로, 생성된 인스턴스를 반환한다.
>>> m1 = Menu.objects.create(name="빵")
>>> m1
<Menu: Menu object (18)> #생성된 인스턴스 반환
#변수에 저장된 인스턴스를 이용해 class안의 변에 접근할 수 있다.
>>> m1.name
'빵'
: 지정된 조회 매개 변수와 일치하는 인스턴스를 반환한다. 이 때 매개 변수는 필드 조회에 설명 된 형식이어야 한다.
>>> m2 = Menu.objects.get(id=1)
>>> m2
<Menu: Menu object (1)>
:지정된 필드에 대해 업데이트를 수행하고 일치하는 행 수를 반환다.
>>> Menu.objects.filter(name='기타').update(name='etc')
1 #총 업데이트된 row개수
>>> Menu.objects.filter(name='카드').update(name='상품권')
1
: 쿼리셋 모든 행에 대해 삭제 쿼리를 수행하고, 삭제된 개체수와 유형별 삭제 횟수가 있는 딕셔너리를 반환한다.
>>>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})
: 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 # 변경 확인
'음료'
: filter()을 함께 사용해 조건에 맞는 데이터가 있는지 조회한다. 있으면 True 없으면 False를 반환한다.
>>> Menu.objects.filter(name="음료").exists()
True
그리고 더 많은 메소드들,,,,,
get_or_create()
, bulk_create()
, count()
, first()
, last
,aggregate()
:한 테이블의 모든 레코드를 가져올 때 사용한다. 그리고 결과로 쿼리셋을 반환한다. 그리고 각 쿼리셋 안에는 각각 인스턴스가 포함되어 있다.
,
>>> 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(**kwargs)
키워드 인나로 주어진 조건에 일치하는 레코드들의 쿼리셋을 반환한다. exclude()는 그 조건에 해당하는 레코드들을 제외한 쿼리셋을 반환한다.
>>> Menu.objects.filter(name="음료").filter(id=2)
<QuerySet [<Menu: Menu object (2)>]>
>>> Menu.objects.filter(name="음료").exclude(id=2)
<QuerySet []>
: iterable로 사용될 때 모델 인스턴스가 아닌 딕셔너리를 포함하는 쿼리셋을 반환한다.
>>> Menu.objects.filter(name="음료")
<QuerySet [<Menu: Menu object (2)>]> #쿼리셋 반환
>>> Menu.objects.filter(name="음료").values()
<QuerySet [{'id': 2, 'name': '음료'}]>
: values() 동일하지만 딕셔너리가 아닌 튜플을 포함하는 쿼리셋을 반환한다. 각 필드 또는 표현식의 갑싱 포함되어 있으므로 첫번째 항목이 첫 번째 필드이다.
>>> Menu.objects.filter(name="음료").values_list()
<QuerySet [(2, '음료')]>