Django:使用带有“dispatch\u uid”的“Signals”时如何防止重复?

2024-09-29 23:26:24 发布

您现在位置:Python中文网/ 问答频道 /正文

你好,我正在测试Django用户/AUTH与其他模型的嵌套。你知道吗

我为我的用户建立了一个简单的模型MyProfil。每次注册一个新的User时,一个新的MyProfil对象将自动创建并链接到特定的User。你知道吗

models.py

#-- create a MyProfil.object for new user 
@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def create_myprofil(sender, instance, created, **kwargs):
    if created:
            MyProfil.objects.create(owner=instance)



class MyProfil(models.Model):
    # --- head
    id = models.UUIDField(primary_key=True, default=uuid4, editable=False)
    oblink = models.UUIDField(unique=True, default=uuid4, editable=False)
    owner = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    # --- body
    aboutme = models.TextField(max_length=300, blank=True)
    city = models.TextField(max_length=300, blank=True)

Question

Django文档提到要使用dispatch_uid来防止可能会发送重复的内容。不幸的是,我真的不明白如何应用dispatch_uid,所以最终用这种方法来处理接收器。你知道吗

models.py

    <...>
from django.core.signals import request_finished



#-- create a MyProfil.object for new user 
@receiver(post_save, sender=settings.AUTH_USER_MODEL, dispatch_uid="my_unique_identifier")
def create_myprofil(sender, instance, created, **kwargs):
    if created:
            MyProfil.objects.create(owner=instance)

request_finished.connect(create_myprofil, dispatch_uid="my_unique_identifier")

<...>

所以我的问题是,这是否是应用dispatch_uid的正确方法?你知道吗


Tags: instanceauthtrueuidmodelsettingsmodelscreate
1条回答
网友
1楼 · 发布于 2024-09-29 23:26:24

您应该使用dispatch_uid来确保对于同一模型/事件,同一事件处理程序的附加次数不会超过一次。你知道吗

例如,考虑以下代码:

request_finished.connect(my_callback)
request_finished.connect(my_callback)

request_finished事件被触发时,函数my_callback将被调用两次,因为它注册了两次。这可以通过在连接回调时传递dispatch_uid来避免。你知道吗

request_finished.connect(my_callback, dispatch_uid="my_unique_identifier")
request_finished.connect(my_callback, dispatch_uid="my_unique_identifier")

相关问题 更多 >

    热门问题