장고 신호

11464 단어 webdevpythondjango
안녕하세요 여러분, django 신호에 대한 다른 게시물을 가지고 왔습니다.
우선 django 신호가 필요한 이유는 무엇입니까? django 신호는 백엔드에서 이벤트 기반 기능을 개발하려고 할 때 유용할 수 있습니다.

django에는 두 개의 엔터티가 있습니다. 하나는 발신자이고 다른 하나는 수신자입니다. 발신자는 특정 이벤트에 대한 신호를 보내고 해당 이벤트를 수신하는 모든 수신자는 신호로 알림을 받고 특정 종류의 작업을 수행합니다.

Django 모델 기반 신호



django의 내장 신호를 사용하여 몇 가지 예를 볼 수 있습니다.

django의 models.py에서 몇 가지 모델을 정의해 봅시다.

# models.py

from django.db import models
from django.contrib.auth.models import User
import datetime

# Create your models here.
class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    profile_url = models.URLField()
    mobile = models.CharField(max_length=20, default='999-999-9999')
    funds = models.FloatField(default=2000)

    def __str__(self):
        return "[PROFILE]:" + self.user.username


class Log(models.Model):
    timestamp = models.DateTimeField(default=datetime.datetime.now)
    message = models.TextField()

    def __str__(self):
        return self.message


여기서 우리는 모델에 의해 내장된 사용자 모델을 확장하는 두 가지 모델 프로필을 정의했습니다. OneToOneField와 다른 하나는 단순히 데이터베이스에 로그 메시지를 저장하는 데 사용되는 로그 모델입니다.

이제 특정 모델이 데이터베이스에 저장된 후 트리거되는 post_save 신호를 사용하는 리버버를 정의할 수 있습니다.

# models.py

# .... models defined above

from django.db.models.signals import post_save
from django.dispatch import receiver


# triggred when User object is created
@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(
            user=instance
        )

# triggred when User object is saved
@receiver(post_save, sender=User)
def log_user_saved(sender, instance, **kwargs):
    Log.objects.create(
        message=f"user {instance.username} is saved"
    )

# triggred when Profile object is saved
@receiver(post_save, sender=Profile)
def log_profile_saved(sender, instance, **kwargs):
    Log.objects.create(
        message=f"profile {instance} is saved"
    )


위에서 볼 수 있듯이 3개의 수신기 함수를 생성하여 각각을 볼 수 있습니다.

create_profile 이 수신기는 User 모델의 post_save 신호가 생성될 때 트리거됩니다. 즉, 사용자 모델이 데이터베이스에 저장된 후 Post_save 신호가 User 모델에 의해 생성되고 create_profile 수신기가 트리거됩니다.

create_profile에서 우리는 django admin으로 이동하여 사용자를 생성하여 확인할 수 있는 사용자에 대한 프로필을 생성합니다.

사용자 생성



사용자 저장됨



프로필 생성됨



위의 이미지에서 볼 수 있듯이 프로필은 post_save 신호의 도움으로 사용자를 위해 자동으로 생성됩니다.

마찬가지로 로그 모델로 이동하면 각 신호에 대해 생성된 로그를 볼 수 있습니다.



위의 이미지에서 사용자 및 프로필에 대한 신호가 트리거될 때 로그 객체가 생성되는 것을 볼 수 있습니다.

post_save와 유사하게 pre_save, pre_delete, post_delete, pre_init와 같은 신호가 있습니다.
post_init, m2m_changed

다양한 신호에 대한 수신기 기능



pre_init

receiver_function(sender, *args, **kwargs)


post_init

receiver_function(sender, instance)


미리 저장

receiver_function(sender, instance, raw, using, update_fields)


post_save

receiver_function(sender, instance, created, raw, using, update_fields)


사전 삭제

receiver_function(sender, instance, using)


post_delete

receiver_function(sender, instance, using)


m2m_변경됨

receiver_function(sender, instance, action, reverse, model, pk_set, using)

좋은 웹페이지 즐겨찾기