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() 方法将更新的记录保存在我的数据库中。

4

1 回答 1

3

很可能point.save()触发相同的信号。因此,您的信号会触发该信号,从而导致无休止的递归。

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

from django.db.models import F 

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

这不仅可以规避信令问题,还可以批量查询,效率更高。

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

于 2019-12-26T18:50:05.097 回答