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() 方法将更新的记录保存在数据库中。
可能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)
| 归档时间: |
|
| 查看次数: |
2125 次 |
| 最近记录: |