我是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_save
或post_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)
答案 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_save
和post_save
属于django's signals系统。信号类似于SQL
中的TRIGGER。
例如,您需要检查年龄是否超过30岁,如果超过30岁则需要执行诸如向某人发送邮件之类的事情。以下是post_save
和pre_save
信号强>