티스토리 뷰

🐍/Django

[Django] 쿼리문 (create, update, delete)

사용자 eungding 2021. 3. 19. 00:35
728x90
반응형

장고의 Making queries 문서를 정리합니다 ✏️ 

 

우선 여기서 말하는 쿼리문은 SQL 쿼리문이 아닙니다.

Model 을 만들면 장고는 자동으로 database-abstraction API를 제공합니다. 

이 API를 통해서 create, retrieve, update, delete 쿼리문을 작성할 것입니다. 

 

retrieve는 다음 글에 작성하고

이 글에서는 create, retrieve, update 만 살펴보겠습니다. 

 

우선 장고의 DB 컨셉을 간단히 다시 보면  (참고: [Django] 튜토리얼 part 2 (1) - 모델, 데이터베이스)

 

model class는 database table,

model class의 instance는 database table의 각각의 record를 의미합니다.

 

 

그럼 이 모델을 예제로 살펴보겠습니다. 

 

 

[1] Create

 

object를 만든 후,  save() 해줍니다.

 

save를 꼭 해줘야합니다. ( "Django doesn’t hit the database until you explicitly call save()" )

그리고 save 메소드는 return value가 없습니다.  

 

 

만약 create and save an object를 single step으로 하고 싶으면 create() method를 이용할 수 도 있습니다. 

 

https://docs.djangoproject.com/en/3.1/ref/models/querysets/#django.db.models.query.QuerySet.create

 

 

 

 

+ SQL 문의 INSERT랑 같습니다. 

 

 

[2] Update

 

b5라는 Blog instance의 name을 바꾸는 작업입니다. 

위와 마찬가지로 save를 꼭 해줘야합니다.

 

 

 ForeignKey field를 업데이트 할 때도 normal field를 업데이트 할 때랑 동일합니다. 

 

 

 ManyToManyField field를 업데이트 할때는 조금 다릅니다.  add() 메소드를 이용합니다. 

 

 

 add() 메소드로 multiple records를 한번에 추가할 수 도 있습니다. 

 

 

 

 

+ SQL 문의 UPDATE 랑 같습니다. 

 

 

[3] Delete 

 

delete() 메소드를 이용합니다. (save 안해줘도 됩니다)

이 메소드는 즉각적으로 object를 지우고

숫자랑 딕셔너리를 반환하는데요 ,

 

지워진 objects의 갯수 

Key는 '지워진 object의 타입'  이고 Value는 지워진 objects의 갯수인 딕셔너리를 반환합니다.

 

 

그리고 objects를 대량으로(in bulk) 지울 수 도 있습니다. 

QuerySet 은 모든 멤버들을 지우는 delete() 를 가지고 있습니다. 

(즉 Model과 Queryset 모두 delete 메소드가 존재합니다.)

 

예를들어 아래 코드처럼 pub_date year이 2005년인 모든 entry를 지울 수 있습니다. 

5개가 지워졌다고 결과로 나오네요! 

 

또다른 예제로 모든 entry를 지울 수 도 있습니다. 

 

(retreive 글에서 나오겠지만 filter랑 all은 QuerySet을 반환합니다)

 

 

그리고 예제의 Entry처럼

ForeignKey  필드의 on_delete 설정을 CASCADE로 해놨다면

 

 

blog가 지워지면 이를 참조하고 있는

모든 entry도 다 지워집니다. 

 

 

 

 

+ SQL 문의 DELETE 랑 같습니다. 

728x90
반응형
댓글
댓글쓰기 폼