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

aba*_*sta 1 django django-signals django-models django-3.0

我有以下 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() 
Run Code Online (Sandbox Code Playgroud)

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

Wil*_*sem 5

可能point.save()会触发相同的信号。所以你的信号触发了那个信号,从而导致无限递归。

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

from django.db.models import F 

def update_points(sender, instance, **kwargs):
    Task.objects.filter(status='Active').update(points=F('points')+5)
Run Code Online (Sandbox Code Playgroud)

这不仅可以解决信令问题,而且可以批量进行查询从而更加高效。

请注意,如果您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)

Run Code Online (Sandbox Code Playgroud)

  • 谢谢威廉·范·翁塞姆。我遇到了同样的问题,经过大量谷歌搜索后在这里找到了你的解决方案:) (2认同)