Django orm 을 사용하여 DB의 데이터를 변경하는 방법은 두 가지가 있다.

 

QuerySet을 가져와 한 번에 변경하는 update, 개별 object에 대해 값을 변경하고 save를 통해 커밋 하는 방법이 그 두 가지이다.

벌크로 업데이트를 할 수 있다는 것과 개별적으로 업데이트가 되는것 이외에도 차이가 존재한다.

 

1. 이미 메모리에 올라와 있는 데이터들에도 반영이 되는가

 

여러 QuerySet 을 한 번에 변경하는 update() 함수는 db에는 update 쿼리를 날리지만, 이미 메모리에 올라온 object 들에 대해서는 변경된 값을 반영해주지 않기 때문에 수동으로 reload를 시켜줘야 한다.


반면에 save를 통해 값을 변경하는 경우는 메모리에 올라온 object에도 변경된다는 차이가 있다.

 

테스트를 통해 알아보자.

save를 사용한 object는 변경된 값이 바로 반영되었으나, update로 변경한 object는 변경된 값이 반영되지 않은 것을 확인할 수 있다.

 

2. signal 함수가 발생하지 않고 auto_now 가 반영되지 않는다.

 

특정 함수가 다른 함수를 trigger 시키는 방법으로 "signal dispatcher" 를 제공하는데, application 간의 coupling 관점에서 볼 때 다음과 같이 다른 함수를 로직 내에서 call 하는 방식과는 차이가 있다.

 

간단하게 설명하면, 로직 내부에서 다른 함수를 호출하려면 함수가 같은 파일 내에 존재하거나,  import하여 함수를 땡겨와야 한다.

이 때, 다른 application 의 함수를 import하여 사용하게 되면 그 만큼 dependency가 커지게 될텐데 이는 아키텍처 관점에서 좋지 않다. 자세한 얘기는 observer pattern과 관련지어 다른 포스트에서 다뤄보려 한다 2022.09.14 - [Django] - Django - Signal & Observer Pattern 에서 다루었다.

 

auto_now도 주의깊게 봐야할 부분이다. model을 설계할 때 주로 last_updated_at 과 같이 최종 변경 시점을 저장하는 field에 auto_now 옵션을 주어 데이터 변경이 일어나는 시점을 자동으로 저장하도록 하는데, update() 사용시에는 이 기능이 보장되지 않는다고 한다. 

 

테스트를 통해 알아보자.

save를 사용한 object는 auto_now가 적용되었으나, update로 변경한 object는 auto_now가 적용되지 않은 것을 확인할 수 있다.

 

References

https://docs.djangoproject.com/en/4.1/topics/db/queries/

 

Making queries | Django documentation | Django

Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate

docs.djangoproject.com

https://docs.djangoproject.com/en/4.1/topics/signals/

 

Signals | Django documentation | Django

Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate

docs.djangoproject.com

https://code-yeongyu.tistory.com/44

 

Django 를 하는데 Signal 이 왔다! (Signal 관련 유의 사항)

최근 회사를 다니며 좋은 사수분 덕에 많은 Django 를 많이 배우고있다. 우리 회사에서는 Django 와 Graphene 을 사용하는데, 그 덕분에 Django 와 DRF 를 동일시 하던 사고 방식이 많이 깨진것같다. 원래

code-yeongyu.tistory.com

 

'Django' 카테고리의 다른 글

Django - Signal & Observer Pattern  (2) 2022.09.14
Django - pytest 환경 구성  (0) 2022.09.06
Django - 동시성 문제 해결하기 (lock)  (0) 2022.05.19
Django - time zone  (0) 2022.04.14
Django - simple jwt 적용 (1) XSS, CSRF  (0) 2022.03.16

+ Recent posts