Model:
class Tester:
test = models.ForeignKey(Platform)
count = models.Integer()
status = models.CharField(max_length=1, default='A')
每次为同一测试插入新记录时,我都需要将状态更改为“ D”。
我尝试使用Signals pre_save,但是该函数陷入了循环。我将非常感谢您的帮助。
答案 0 :(得分:1)
重写Tester类的save方法:
def save(self, *args, **kwargs):
if Tester.objects.filter(test=self.test).count()>0:
self.status="D"
else:
self.status="A"
super(Model, self).save(*args, **kwargs)
将其放入Tester的类定义中。
答案 1 :(得分:1)
信号功能可能会陷入无限循环,因为您将相同模型的实例保存在该函数中,而每个实例又触发了信号函数本身。稍加注意,您就可以防止这种情况的发生:
from django.db.models.signals import pre_save
@receiver(pre_save, sender=Tester)
def tester_pre_save(sender, instance, **kwargs):
if not instance.pk:
# This means that a new record is being created. We need this check as you want to do the operation when a new entry is **inserted** into table
Tester.objects.filter(test=instance.test).update(status='D')
或者,带有post_save信号:
from django.db.models.signals import post_save
@receiver(post_save, sender=Tester)
def tester_post_save(sender, instance, created, **kwargs):
if created:
# This means that a new record has been created. We need this check as you want to do the operation when a new entry is **inserted** into table
Tester.objects.filter(test=instance.test).update(status='D')
重要的是。因为我们使用查询集的 update 方法来更新现有条目,所以这些不会触发信号,因为它们未使用模型的save方法,因此不会为其他实例我们在这里更新。而且即使触发它,当我们在条件检查下执行更新操作(如果正在创建新实例)时,那些其他保存的信号方法也不会做任何事情,因此它们不会引起无限循环