Django | CRUD - basic query string

gemma. K·2020년 11월 15일
0
post-custom-banner

CRUD

CRUD란 Create, Read, Update, Delete 즉, db 테이블의 row들 혹은 row를 생성, 읽기, 업데이트, 삭제하는 방식을 의미한다. 우리가 직접 개발하는 API들이 db의 데이터를 조작하고 가져오는 것이므로 API 개발을 위해서는 CRUD를 못한다면 진정한 백엔드 개발자라고 볼 수 없다.


Create

  • db 테이블에 row를 생성하는 것
  • <클래스명>.objects.create()
<클래스명>.objects.create(email=hello123@vel.com, password=12345678)

Read

  • db 테이블의 row를 가져 오는 것이다.
  • 여러 방법이 있는데 row 자체 즉, 그 객체를 가져 오는 것과 queryset, row 객체들의 리스트 형태로 가져오는 query string이 있다.

1. all

  • 모든 데이타(로우)를 queryset 형태로 가져온다.
<클래스명>.objects.all(조건)
< QuerySet [ ] >

2. get

  • get 쿼리문은 객체 자체에 접근 가능하므로 .<컬럼이름>으로 해당 값에 직접적으로 접근 가능하다.
a = <클래스명>.objects.get(pk=5)

a.id  
# 5

a.name 
# 'cat'

a.image_url 
# 'cat.jpg'

3. filter ()

  • 조건에 해당되는 객체들만 queryset 형식으로 반환된다.
<클래스명>.objects.filter(조건)
< QuerySet [  ] >

4. exclude (queryset)

  • filter와는 반대로 조건에 해당 되는 객체만 제외하고 queryset 형식으로 반환된다.
<클래스명>.objects.exclude(조건)
< QuerySet [  ] >

Update

로우의 컬럼 값을 수정 가능하다. 단순히 update 쿼리문을 쓰면 모든 로우에 수정이 이루어 진다. 일부의 로우들만 수정하고 싶을 경우 그 로우들을 쿼리셋으로 불러와서 업데이트 쿼리문을 사용한다.

<클래스명>.objects.update(조건)

홍길동이란 이름을 가진 로우의 전화번호를 수정하고 싶은 경우

<클래스명>.objects.filter(name=홍길동).update(number=01012345678)

Delete

delete 쿼리문 또한 update와 비슷하다. 일부의 쿼리셋을 데려오지 않으면 테이블의 모두 로우들을 삭제한다. 그래서 보통을 쿼리문을 또 써서 삭제하고 싶은 로우만 선택해 삭제한다.

<클래스명>.objects.delete()

id가 100인 데이터만 제외한 뒤, 모든 데이터 삭제

<클래스명>.objects.exclude(id=100).delete()

CRUD 초보를 위한 깨알팁 👀

  • 쿼리셋이 반환 되는 쿼리문은 그 뒤에 또 다른 쿼리문을 추가할 수 있다.
  • 대표적인 쿼리셋이 반환되지 않는 쿼리문은 get이다.
  • get 쿼리문을 사용하면 한 가지 로우(객체)를 가져와서 직접적으로 컬럼 값에 접근할 수 있다.
  • 쿼리셋이 반환되는 쿼리문(ex. filter)을 활용할 땐, for문 혹은 list comprehension을 활용해 각 로우의 컬럼 값에 접근한다.

1. get 활용

id가 3인 사용자의 객체를 data라는 변수에 담고, 해당 사용자의 이름(컬럼), 전화번호(컬럼) 값을 name, number 변수에 담아 활용 가능하다.

data = User.objects.get(id=3)

name = data.name
number = data.number

2. filter 활용

사는 곳이 서울인 모든 사용자들(쿼리셋)을 변수 posts에 담은 뒤, list comprehension을 활용해 서울에 사는 사용자들의 전화번호를 담을 리스트를 만든다.

users = User.objects.filter(place=Seoul)

result = [user.number for user in users]
post-custom-banner

0개의 댓글