반응형
save_m2m
에 대해서 알아보자.
https://github.com/django/django/blob/main/django/forms/models.py
django/forms/models.py
에서 500라인 즈음에 BaseModelForm
클래스의 def save
메소드를 살펴보자.
if commit:
# If committing, save the instance and the m2m data immediately.
self.instance.save()
self._save_m2m()
else:
# If not committing, add a method to the form to allow deferred
# saving of m2m data.
self.save_m2m = self._save_m2m
return self.instance
이런 구문이 보이는데, 인수 commit=False
일 때, self.save_m2m = self._save_m2m
으로 지정하는 것을 볼 수 있다. 그리고 commit=True
일 때에는 self.instance.save()
가 호출된 이후(아마도 모델의 save()
가 호출되는 것으로 생각됨) self._save_m2m()
메소드가 호출이 된다.
원리적으로 살펴보자면, commit=True
는 실제 테이블에 반영, commit=False
는 반영하지 않는다는 옵션이다. 데이터베이스 트랜젝션과는 연관이 있는 듯 없는 듯 하다. (정확히는, 데이터베이스의 트랜젝션을 이용하지 않고, 장고 자체적으로 조금 비슷하게 구현된 것으로 생각된다.)
commit=False
인 상태에서는, save
가 이루어져도, pk값을 안 가지게 된다. 조금 사전 작업을 진행하는 것으로 생각된다. 이 시기에는 pk값이 없으므로, fk로 물려있을 테이블들에 데이터를 생성할 수가 없다.
commit=True
일 때에 self.instance.save()
로 생성한 후에 _save_m2m()
으로 조인된 로우들을 생성하는 것으로 보여진다.
반응형
'개발 > 파이썬 Python' 카테고리의 다른 글
Numpy 의 Axis 옵션에 대한 정리. (0) | 2021.05.07 |
---|---|
[파이썬] mysqlclient 모듈 설치 오류 : Running setup.py install for mysqlclient ... error (0) | 2021.04.10 |