Django - сигнал m2m_changed не сохраняет изменения в соответствующей модели - PullRequest
0 голосов
/ 16 января 2020

Я создал функцию для запуска по сигналу m2m_changed. После выполнения различных действий мне нужно обновить поле для объектов BMGUser.

По существу: я подписываю BMGUser на AWS Simple Notification Service topi c и сохраняю arn в объекте BMGUser.

Проблема: когда я обновляю поле resorts объекта BMGUser напрямую, код работает. Когда я обновляю поле bmg_users из объекта Resort, функция запускается и запускается, но изменения пользовательских объектов в функции не сохраняются.

Код:

class Resort(models.Model):
    """
    Resort model
    """

class BMGUser(models.Model):
    """
    Extend the User model to include a few more fields
    """
    resorts = models.ManyToManyField(Resort, related_name='bmg_users')
    sub_arn = models.CharField("AWS SNS Subscription arns", max_length=1000, blank=True, null=True)

@receiver(m2m_changed, sender=BMGUser.resorts.through)
def subscribe_sns_topic(instance: Union[BMGUser, Resort], action: str, reverse: bool, pk_set: Set[int],
                        **kwargs) -> None:
    """
    Subscribe or unsubscribe the user to the relevant resort SNS topic, if resort added to their obj

    :param instance: BMGUser or Resort object being updated
    :param action: type of update on relation
    :param reverse: False if BMGUser is being modified directly; True if Resort object is being modified
    :param pk_set: set of primary keys being added or removed to the m2m field
    """
    # Instance -> BMGUser
    # This works
    if action == 'post_add' and not reverse:
        sub_arns = subscribe_user_to_topic(instance, client)
        instance.sub_arn = json.dumps(sub_arns)
        instance.save()

    # Instance -> BMGUser
    # This works
    elif action == 'pre_remove' and not reverse:
        for id in pk_set:
            resort = Resort.objects.get(pk=id)
            sub_arns = unsubscribe_user_to_topic(instance, client, resort)

            instance.sub_arn = json.dumps(sub_arns)
            instance.save()

    # Instance -> Resort
    # This fails
    elif action == 'post_add' and reverse:

        for indx, user in enumerate(instance.bmg_users.all()):
            if user.pk in pk_set:
                sub_arns = subscribe_user_to_topic(user, client)

                user.sub_arn = json.dumps(sub_arns)
                user.save()

    # Instance -> Resort
    # Haven't been able to test this yet
    elif action == 'pre_remove' and reverse:
        users = BMGUser.objects.filter(pk__in=pk_set)

        for user in users:
            sub_arns = unsubscribe_user_to_topic(user, client, instance)

            user.sub_arn = json.dumps(sub_arns)
            user.save()

Любой предложения, почему обновления пользовательских объектов не сохраняются?

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