我的Django信号中超出了最大递归深度

问题描述 投票:1回答:1

我有以下Django信号,当保存新记录时,该信号基本上触发该信号以将postgres db中的先前记录的点增加5,但是我的Django信号将更改保存为1先前的记录,但我得到了错误RecursionError: Maximum recursion depth exceeded

# models.py

from django.db.models.signals import post_save    

class Task(models.Model):
    ....


def update_points(sender, instance, **kwargs):

    qs = Task.objects.filter(status='Active')

    for task in qs:
        task.points = task.points + 5
        task.save() 

我在做什么错?插入新记录后,我正在使用.save()方法将更新的记录保存在数据库中。

django django-models django-signals django-3.0
1个回答
1
投票
就像point.save()触发相同的信号。因此,您的信号会触发该信号,从而导致无限递归。

您可以批量查询更新值:

from django.db.models import F def update_points(sender, instance, **kwargs): Task.objects.filter(status='Active').update(points=F('points')+5)

这不仅可以解决信令问题,而且可以在

bulk中进行查询,因此效率更高。

注意,如果您是post_save,那么刚刚添加的Task将成为QuerySet的一部分。也许您想排除Task。在这种情况下,我们可以这样实现:

from django.db.models import Q, F from django.db.models.signals import post_save def update_points(sender, instance, created, **kwargs): if created: Task.objects.filter(~Q(pk=instance.pk), status='Active').update( points=F('points')+5 ) post_save.connect(update_points, sender=Task)

© www.soinside.com 2019 - 2024. All rights reserved.