gpt4 book ai didi

python - Django:将 "Signals"与 "dispatch_uid"一起使用时如何防止重复?

转载 作者:行者123 更新时间:2023-12-01 07:12:00 24 4
gpt4 key购买 nike

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

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 的正确方法?

最佳答案

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

关于python - Django:将 "Signals"与 "dispatch_uid"一起使用时如何防止重复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58157926/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com