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