객체 생성 후 save()
메서드로 데이터 베이스에 반영한다.
SQL의 INSERT와 같이 동작한다.
from appname.models import Model
from django.utils import timezone # 생성시간 쓰기위해 불러들임
data = Model(컬럼명1=값1, 컬럼명2=값2, 타임컬럼=timezone.now())
data.save() # Model 테이블에 지정한 컬럼명=값 이 추가 된다.
DB의 내용을 조회하기 위해 QuerySet객체를 사용한다. DB의 객체를 꺼내 담은 컬랙션이 Queryset!
Queryset은 SQL의 SELECT와 같이 동작한다.
Model.objects.all()
# <QuerySet [<Model: What's new?>, <Model: 2nd time>]>
Model.objects.filter(pk=1)
Model.objects.filter(pk=1, col__startwith='what')
# pk가 1이며, col이 what으로 시작하는 레코드
# <QuerySet [<Model: What's new?>]>
Model.objects.exclude(pk=1)
# <QuerySet [<Model: 2nd time>]>
Model.objects.filter(col__icontains='?').exclud(pk=3)
# col에 '?'가 포함되고, pk가 3이 아닌
OFFSET, LIMIT는 all()
, filter()
, exclude()
와 함께 [n:n]
으로 지정한다.
LIMIT, OFFSET을 사용할 경우 Queryset이 아닌 리스트 형으로 데이터를 반환한다.
Model.objects.all()[:3] # 데이터 중 처음부터 3개 까지만 가져온다.
Model.objects.all()[3:6] # 3~5번까지 가져온다
Model.objects.all()[3:] # 3번부터 끝까지 데이터를 가져온다.
UPDATE, DELETE의 경우 쿼리문이 적게 사용 or 일괄처리 될때 속도가 빠르다.
여러게의 쿼리문을 실행해야한다면 속도가 느려짐 > 성능저하를 일으키기 때문에 효율적으로 코드를 작성해야한다.
이미 존재하는 객체를 수정할때, save()
메서드를 사용한다. SQL에느 UPDATE와 같다.
# ** 모델인스턴스별 SQL 수행 = 많은 레코드 수정시 성능저하!
# 수정하고 싶은 데이터를 가져와 변수에 담는다.
data = Model.objects.filter(col__startwith='hello')
# <QuerySet [<Model: hello django>]>
# 변수의 컬럼에 값을 수정한뒤
data.col = 'update'
# 저장하면 DB에 반영된다.
data.save()
Model.objects.all()
# <QuerySet [<Model: update>]>
# -------------------------------------------
Question.objects.filter(pub_date__year=2020).update(col='update')
# 3 : 변경된 레코드 숫자가 리턴된다
# -------------------------------------------
delete()
메서드를 사용해 레코드를 삭제한다. SQL문 역시 DELETE를 사용한다.
# 테이블의 내용 전체 삭제
Model.objects.all().delete()
# 특정 조건에 해당하는 레코드 내용 삭제
Model.objects.filter(pub_date__year=2020).dalete()
__str__
클래스형 모델을 만들고 __str__
메서드를 생성해 객체를 문자열로 표현 할 수 있게 한다.
def __str__(self):
return self.col
# 쿼리셋이나 뭐시기를 할때 모델을
# 모델명 col내용으로 표기된다
# 예 : <QuerySet [<Model: update>]>
# 에서 Model: update 에 해당