[Django] QuerySet, ORM을 이용한 Data CRUD

hukim·2020년 10월 7일
0

Django

목록 보기
2/12

QuerySet

QuerySet은 SQL을 생성해주는 인터페이스.

QuerySet을 이용해서 별도로 SQL을 작성할 필요 없이 DB로 부터 데이터를 가져오고 추가, 수정, 삭제 등이 가능합니다.

Model Manager를 통해서 해당 Model에 대한 QuerySet을 획득합니다.

  • Post.objects.all() : SELECT * FROM post~ 와 같은 SQL문 생성.
  • Post.objects.create() : INSERT INTO post VALUES(~)와 같은 SQL문 생성.

Models.py

위와 같이 모델이 정의되어있고, Menu와 Category에 스타벅스 데이터(음료)를 추가해보겠습니다.

menu와 category 테이블은 위 그림과 같은 관계를 가지고 있습니다.

Create (DB 데이터 추가)

# django shell 실행
python manage.py shell
  • iPython 을 이용

명령어를 입력해서 django shell에서 진행합니다.

1. Menu

create를 하기전에 가장 먼저 위에서 작성한 모델 클래스를 import 해야합니다.
from products.models import Menu

import하고 데이터를 추가할 때 총 3가지 방법을 이용해서 추가해봤습니다.

  • create()
  • save()
  • bulk_create()

save() 메소드는 다음처럼 이용할수도 있습니다.

>>> a1 = Menu(name='푸드')
>>> a1.save()

bulk_create() 메소드도 비슷하게 사용할 수 있습니다.

>>> a1 = Menu(name='상품')
>>> a2 = Menu(name='카드')
>>> Menu.objects.bulk_create([a1, a2])

bulk_create() 메소드는 하나의 query로 여러 개의 object를 생성합니다.
여러 개의 object를 생성할 때 object마다 하나의 query를 거치는 create() 메소드보다 효율적으로
처리할 수 있습니다.

2. Category

category 테이블은 menu_id를 참조하고 있기 때문에 menu테이블과는 create가 조금 다릅니다.

menu에서 '음료'에 해당하는 카테고리들을 추가했습니다.

'콜드 브루 커피'가 참조하고 있는 menu의 id를 확인하고 create 해줍니다.

Read (DB 데이터 읽기)

데이터를 생성했으니 각 테이블에 잘 들어갔는지 확인해봅니다.

### 테이블 데이터 전부 출력 
>>> Category.objects.all()

### Category 데이터 중 음료 Menu를 참조하고 있는 데이터만 출력
>>> Category.objects.filter(menu_id=1)
or
>>> Category.objects.filter(menu__name='음료')

### 음료 Menu를 참조하는 모든 데이터의 name 값을 출력
>>> for category in Category.objects.filter(menu__name='음료'):
 print(category.name)
 
### 음료 Menu를 참조하는 모든 카테고리 출력
>>> a1 = Menu.objects.get(name='음료')
>>> a1.category_set.all()

### 음료 Menu를 참조하는 모든 카테고리 개수 출력
>>> a1 = Menu.objects.get(name='음료')
>>> a1.category_set.count()

### 블렌디드 카테고리가 참조하고 있는 메뉴의 name값 출력
>>> a2 = Category.objects.get(name='블렌디드')
>>> a2.menu.name

Update (DB 데이터 수정)


filter() 메소드를 이용해서 category에서 name이 '콜드 브루 커피'인 부분을 '콜드 브루'로 수정했습니다.

지금은 name으로 filter를 했지만 조건을 바꾼다면 한 번에 여러 개의 데이터를 수정할 수 있습니다.

위 처럼 get()으로 받아와서 update를 하는경우는 pk가 단일 컬럼으로 잡혀있는 경우에만 사용이 가능합니다. (여러 컬럼이 묶여 하나의 pk를 이루는 형태에서는 불가능)

해당 object가 테이블에 존재하지 않으면 insert기능을 수행하고 그렇지 않으면 update 기능을 합니다.

Delete (DB 데이터 삭제)

delete는 update와 유사하지만 단일 행이나 복수 행 구분없이 똑같이 delete() 메소드를 사용합니다.

### 단일 삭제
>>> data = Category.objects.get(name='콜드 브루 커피')
>>> data.delete()

### 다중 삭제
>>> Category.objects.filter(name='콜드 브루 커피').delete()

0개의 댓글