как я могу предотвратить дублирование сигналов? у меня есть пользователь, назначенный как «клиенту», так и «работнику» вместо одной группы соответственно

#django

#django

Вопрос:

Что я могу делать неправильно, код выполняется два раза. вместо загрузки пользователя в его конкретную группу из django.db.models.signals импортируйте post_save

 from django.contrib.auth.models import User
from django.contrib.auth.models import Group


from .models import Client, Worker


def client_profile(sender, instance, created, **kwargs):
    if created:
        group = Group.objects.get(name='client')
        instance.groups.add(group)
        Client.objects.create(
            user=instance,
            name=instance.username,
        )
        print('Profile created!')


post_save.connect(client_profile, sender=User, dispatch_uid="client_profile")


def worker_profile(sender, instance, created, **kwargs):
    if created:
        group = Group.objects.get(name='worker')
        instance.groups.add(group)
        Worker.objects.create(
            user=instance,
            name=instance.username,
        )
        print('Profile created!')


post_save.connect(worker_profile, sender=User, dispatch_uid="worker_profile")
 

Ответ №1:

Это ожидаемое поведение, вы сообщаете своим сигналам, что каждый раз, когда создается пользовательская модель, вы должны добавлять их в группу без каких-либо конкретных инструкций.

Вместо этого вы могли бы проверить, находится ли пользователь уже в данной группе, если да, не добавляйте их, иначе добавьте в группу.

Сигналы в Django

Также я вижу, что у вас есть две разные модели: одна для рабочего, другая для клиента, поэтому лучшим обходным путем было бы использовать отправителя в качестве либо вашей рабочей, либо клиентской модели, а затем добавить экземпляр пользователя в группу.