이 과정에서 장고의 역할은 URLconf 클라이언트 요청을 분리하고, View 에소 요청을 처리하기 위한 로직를 처리하고, Model 에서 데이터 처리를 한다.
이 과정을 둘로 나눠서 본다면 통신 및 요청 처리와 데이터 처리(Model과 ORM)로 볼수 있다.
- QuerySet이란?
쿼리셋은 데이터베이스에 있는 객체의 모음을 말한다. 각 객체들은 데이터베이스에서 하나의 record(row)에 해당한다. python에서 작성한 코드가 sql로 매핑되어 QuerySet이라는 자료형태로 값이 넘어온다. 이 쿼리셋으로 데이터베이스로부터 데이터를 읽고, 필터를 걸거나 정렬할 수 있다. 쿼리셋은 데이터베이스와 소통하기 위한 자료형이다.
📍 헷갈리지 말것
- model class는 databases의 테이블, model class의 instance(객체)는 database table의 각각의 record를 말한다.
1. create()
함수로 만들기
>>> c1 = Category.objects.create(name="쿠키",menu_id=2)
>>> c1
<Category: Category object (7)> #인스턴스 반환
c1
2. 모델 instance의 save함수를 통해 만들기
>>> c2 = Category(name="쿠키",menu_id=2)
>>> c2.save() #꼭 저장을 해야함.
>>> c2
<Category: Category object (8)>
get()
를 사용할 경우 unique한 한 값을 검색하는 것이 좋다 DoesNotExist
에러가 발생하고, 여러개의 객체가 조회되면MultipleObjectsReturned
에러가 발생한다. >>> m = Menu.objects.get(id=1)
>>> m
<Menu: Menu object (1)> #인스턴스
>>> m.name
'음료'
>>> m3 = Menu.objects.filter(id=2)
>>> m3
<QuerySet [<Menu: Menu object (2)>]> #쿼리셋
>>> p = Product.objects.filter(category_id=1) #category_id가 2인 객체 다 가져오기
>>> p
<QuerySet [<Product: Product object (1)>, <Product: Product object (2)>]>
>>> pp = Product.objects.filter(name="바닐라 콜드 브루")
>>> pp
<QuerySet [<Product: Product object (1)>]>
- get과 filter의 차이
get은 인스턴스 하나를 가져오고, 필터는 쿼리셋를 가져온다. 따라서 어떤 데이터를 가져오냐에 따라서 사용을 달리하면 된다. 쿼리셋은 쿼리셋를 반환하기 때문에 인덱싱 할 수 있다.- 값이 없을 때 get()은
DoesNotExist
을 가져오고, 쿼리셋은 빈 쿼리셋을 가져온다. 그리고 get()은 쿼리셋을 호출하는 것이 아니기 때문에 뒤에 다른 메소드를 추가할 수 없다.
>>> Product.objects.all()
<QuerySet [<Product: Product object (1)>, <Product: Product object (2)>, <Product: Product object (3)>, <Product: Product object (4)>]>
# 전체를 가져와서 활용가능
>>> a = Menu.objects.all()
>>> type(a)
<class 'django.db.models.query.QuerySet'>
>>> a[0]
<Menu: Menu object (1)>
>>> a[1]
<Menu: Menu object (2)>
>>> for i in a: #for문 사용도 가능
... print(i)
...
Menu object (1)
Menu object (2)
Menu object (3)
Menu object (4)
Menu object (5)
Menu object (6)
# 모델 인스턴스(객체) 속성을 변경하기
>>> update_instance = Category.objects.get(id=7) #category_id가 7인 객체를 인스턴스에 저장
>>> update_instance
<Category: Category object (7)>
>>> update_instance.name = "샌드위치" #이름을 수정하기
>>> update_instance.save() #save를 하기 전에 파이썬 코드에서만 적용된것이므로 저장 필요
>>> update_instance
<Category: Category object (7)>
#인스턴스 삭제
>>> post_instance = Category.objects.get(id=8)
>>> post_instance.delete()
(1, {'products.Category': 1})
#쿼리문 삭제
>>> mm = Menu.objects.filter(id=5)
>>> mm.delete()
(1, {'products.Menu': 1})