Я создал функцию для запуска по сигналу 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()
Любой предложения, почему обновления пользовательских объектов не сохраняются?