Django:保存之前更新记录

时间:2020-04-28 05:34:32

标签: django django-models

Model:

class Tester:
    test = models.ForeignKey(Platform)
    count = models.Integer()
    status = models.CharField(max_length=1, default='A')

每次为同一测试插入新记录时,我都需要将状态更改为“ D”。

我尝试使用Signals pre_save,但是该函数陷入了循环。我将非常感谢您的帮助。

2 个答案:

答案 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方法,因此不会为其他实例我们在这里更新。而且即使触发它,当我们在条件检查下执行更新操作(如果正在创建新实例)时,那些其他保存的信号方法也不会做任何事情,因此它们不会引起无限循环

相关问题