본문 바로가기

Python/Django

[Django] post_save()는 뭐야?

728x90

모델을 생성함에 있어 필수적으로 동시에 생성되어야 하는 경우가 있습니다. User 생성 시 Profile 모델 생성을 예시로 들 수 있습니다. 이때 사용할 수 있는 것이 바로 post_save()입니다. post_save()의 내용은 모델의 save() 함수의 끝에 전해지게 됩니다. post_save()와 함께 전송되는 인자들은 다음과 같습니다.

 

  • sender: 모델 클라스를 저장합니다.
  • instance: 모델의 record 데이터를 가지고 있습니다.
  • created: 새로운 record이 생성되었다면 True 아니라면 False를 반환합니다.
  • raw: 새로운 record의 생성 시간이 현재 시간일 때 True를 반환합니다.
  • using: 데이터베이스의 alias를 반환합니다.
  • update_fields: model.save()에 updatate_fileds를 사용하여 저장한 경우 해당 값을 반환해줍니다.

 

다음은 post_save()를 사용하는 법입니다. 우선 signals.py 파일을 생성해줍니다. 그리고 다음의 코드를 넣어줍니다.

 

from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver

from .models import Profile


@receiver(post_save, sender=User)
def creat_profile(sender, instance, created, **kwargs):

    if created:
        Profile.objects.create(user=instance)

 

위의 코드는 다음의 동작을 합니다. decorater를 통해서 signal에 필요한 인자들을 넘겨줍니다. 그리고 만약 User 모델에 새로운 record가 추가되면 Profile 모델의 user 필드를 instance의 값을 넣어주어 Profile에 새로운 record를 생성하라는 코드입니다. 해당 코드가 동작하게 하기 위해서 apps.py에 다음의 코드를 넣어줍니다.

 

from django.apps import AppConfig


class AccountsConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'accounts'

    def ready(self):
        import accounts.signals

 

def ready(self) 부분만 추가해주면 됩니다. ready 함수는 signal을 등록 같은 초기화 작업을 수행할 수 있습니다. 위의 코드까지 넣었다면 이제 User를 추가하면 자동으로 Profile 모델이 생성되는 것을 확인할 수 있습니다.

 

전체 코드는 https://github.com/piaochung/django_rest_framework의 api-level-3에서 확인할 수 있습니다.

728x90