我有以下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)
这不仅可以绕开信令问题,而且可以批量查询,因此效率更高。
需要注意的是,如果你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)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句