我的 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)
我有以下 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)