【问题标题】:Django: How to prevent duplicates when using "Signals" with "dispatch_uid"?Django:如何在使用带有“dispatch_uid”的“信号”时防止重复?
【发布时间】:2020-01-29 03:50:30
【问题描述】:

您好,我正在测试 Django User/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)

问题

提到使用dispatch_uid 的 Django Doc 以防止重复发送。不幸的是,我不太明白如何申请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 的正确方法?

【问题讨论】:

    标签: python django django-models django-signals


    【解决方案1】:

    您应该使用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")
    

    【讨论】:

    • 谢谢。对于 django 文档中的语义,我仍然有点困惑。所以“事件处理程序”是信号(post_save 等),而“信号处理程序”是我的函数,就像我的示例 create_myprofil 一样?所以发送者将标识符包裹在信号周围,request_finished.connect(dispatch_uid=) 将标识符包裹在我的 signal handler(def create_myprofil) 周围?所以如果我的signal handler 没有相同的标识符,什么都不会发生?
    猜你喜欢
    • 1970-01-01
    • 2013-01-22
    • 2018-03-05
    • 1970-01-01
    • 2012-09-20
    • 1970-01-01
    • 2011-12-09
    • 2017-02-08
    • 1970-01-01
    相关资源
    最近更新 更多