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

Maximum recursion depth exceeded in my Django signal

我有以下 Django 信号,当保存新记录时,它基本上触发信号将我以前在 postgres 数据库中的记录的点数增加 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() 方法将更新的记录保存在我的数据库中。

可能 point.save() 触发相同的信号。所以你的信号会触发那个信号,因此这会导致无休止的递归。

您可以使用查询批量更新值:

from django.db.models import F 

def update_points(sender, instance, **kwargs):
    Task.objects.filter(status='Active').<b>update(points=F('points')+5)</b>

这不仅可以绕过信令问题,而且可以批量查询,效率更高。

请注意,如果您 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').<b>update(
            points=F('points')+5
        )</b>

post_save.connect(update_points, sender=Task)