save()与预保存和保存后

时间:2018-03-14 15:34:23

标签: python django

我是Django的新手,我有以下问题,我需要你的建议。 Django文档对我来说还不够,因为它缺少示例

这里我们设置.save()功能:并且我不知道我应该使用前/后

def update_total(self):
    self.total=self.cart.total+self.shipping_total
    self.save()

postsave函数中,我们没有放save()

def postsave_order_total(sender,instance,created,*args,**kwargs):
    if  created:
        print("just order created ")
        instance.update_total()

post_save.connect(postsave_order_total,sender=orders)

并且使用m2m信号我们放了.save函数,是真的,如果这就是为什么我们没有将.save()放入pre_savepost_save()

def cal_total(sender,instance,action,*args,**kwargs):
    # print(action)
    if action=="post_add" or action=="post_remove" or action=="post_clear":
        prod_objs=instance.products.all()
        subtotal=0
        for prod in prod_objs:
            subtotal+=prod.price
        print(subtotal)
        total=subtotal+10
        instance.total=total
        instance.subtotal=subtotal
        instance.save()


m2m_changed.connect(cal_total, sender=cart.products.through)

在m2m信号中我为什么指定了动作:

if action=="post_add" or action=="post_remove" or action=="post_clear"

同样在更新中,我没有使用save()

qs = orders.objects.filter(cart=instance.cart,active=instance.active).exclude(billing_profile=instance.billing_profile)
    if qs.exists():
        qs.update(active=False)

2 个答案:

答案 0 :(得分:0)

pre_save在保存模型之前,post_save在保存模型之后。

在保存模型以附加文件之后,在保存或post_save之前,请先处理信息,以确保数据是否有效。

答案 1 :(得分:0)

假设你有一个模型,如下所示

class SampleModel(models.Model):
    name = models.CharField(max_length=120)
    age = models.IntegerField()
    address = models.CharField(max_length=100)

因此,我们可以通过

创建其模型实例
In [3]: sample = SampleModel.objects.create(name="John",age=23,address="some address")

In [5]: sample.id
Out[5]: 4


在某些时候,您想要更改age,您需要对其进行编辑,编辑后必须调用.save()方法将更改写入数据库

In [6]: instance = SampleModel.objects.get(id=4)

In [7]: instance.age
Out[7]: 23

In [8]: instance.age = 50

In [9]: instance.save()

In [10]: instance.age
Out[10]: 50


因此,如果您需要将更改写入数据库,则应调用 save()方法。

pre_savepost_save属于django's signals系统。信号类似于SQL中的TRIGGER
例如,您需要检查年龄是否超过30岁,如果超过30岁则需要执行诸如向某人发送邮件之类的事情。以下是post_savepre_save 信号