Джанго несколько сигналов с одного приемника - PullRequest
0 голосов
/ 06 июля 2019

Я пытаюсь добавить сигнал post_save и post_delete в приемник. Тем не менее, я получаю сообщение об ошибке: TypeError: change_followers() missing 1 required positional argument: 'created'

@receiver([post_save, post_delete], sender=Following)
def change_followers(instance, created, **kwargs):
    if created:
        instance.follower.following_count += 1
        instance.target.follower_count +=1
        instance.save()
    else:
        instance.follower.following_count -= 1
        instance.target.follower_count -=1
        instance.save()

Почему я получаю эту ошибку и как ее исправить?

Ответы [ 2 ]

0 голосов
/ 06 июля 2019

Я полагаю, что сигнатура сигнала post_delete не включает параметр "созданный" - что означает значение "созданный" в контексте post_deleted?

Одно из решений:

@receiver([post_save, post_delete], sender=Following)
def change_followers(instance, **kwargs):
    if kwargs.get("created"):
        instance.follower.following_count += 1
        instance.target.follower_count +=1
        instance.save()
    else:
        instance.follower.following_count -= 1
        instance.target.follower_count -=1
        instance.save()
0 голосов
/ 06 июля 2019

Сигнал post_delete [Django-doc] делает не отправку параметра created.

Однако вы можете легкоисправьте это, добавив значение по умолчанию к параметру:

@receiver([post_save, post_delete], sender=Following)
def change_followers(instance, <b>created=False</b>, **kwargs):
    if created:
        instance.follower.following_count += 1
        instance.target.follower_count +=1
        instance.save()
    else:
        instance.follower.following_count -= 1
        instance.target.follower_count -=1
        instance.save()

Обратите внимание, что логика все еще неверна : поскольку при обновлении экземпляра модели вы вызовете post_save, но это не означает, что этот экземпляр удален.Кроме того, если вы обновляете экземпляр модели, это может означать, что target / follower изменяется, и, следовательно, вы должны уменьшить это число.

Более того, вероятно, не стоит использовать сигналы для вычисления последователейВ любом случае считается, поскольку вызовы Django ORM могут обходить сигналов.Возможно, лучше пометить ваши объекты числом Following с.Если вы используете сигналы, вам нужно будет периодически запускать запрос, который синхронизирует сумму.

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