본문 바로가기
개발/파이썬 Python

[python, django] 'save_m2m'

by 언제나초심. 2023. 12. 22.
반응형

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()으로 조인된 로우들을 생성하는 것으로 보여진다.

반응형