Django: Как предотвратить дублирование при использовании «Сигналов» с «dispatch_uid»? - PullRequest
1 голос
/ 29 сентября 2019

Здравствуйте, я тестирую вложенность 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)

Вопрос

В упомянутом документе Django Doc используется 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?

1 Ответ

1 голос
/ 29 сентября 2019

Вы должны использовать 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")
...