继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

django实现类似触发器的效果

大话西游666
关注TA
已关注
手记 209
粉丝 140
获赞 620


这篇博客给大家讲解在django中类似触发器的效果

这篇教程分别会讲解

插入记录后,删除记录前,删除记录后这三个部分

相关环境  python 3.6    django2.0


我们一起来看看需求

有一个博客模型 ,有一个 博客计数模型

现在的需求是每要创建一个博客,就把博客计数模型中的计数字段初始化为0,我们不禁想到了触发器

在创建完blog记录后,我们就对应着在博客计数表上进行相关操作。


一起来看看博客计数模型


再来看看博客模型


可以看到,在产生模型实例(即数据库表产生新纪录)的时候,重写父类模型中的save方法,在save方法中建议先调用一次save方法,将记录写在数据表中,再去自定义实现自己拓展的功能


好了  插入记录的触发器效果我们完成了,再来看看删除记录的触发器效果该如何实现


我们现在仍然有一个需求,为了保持数据库的一致性,我们希望在删除博客之前,先将该博客下的评论都删除,再将该博客删除

看看我们的评论模型


这个时候就不能像save()方法那样,解决方案是在models.py中进行相关操作,在删除之前发送一个信号,将该博客记录传给该方法

这里的形参instance即为接受的博客模型实例

  1. <span style="font-size:16px;">from django.db.models.signals import post_save, post_delete,pre_delete  

  2. from django.dispatch import receiver  

  3.  

  4. @receiver(pre_delete, sender=Blog)  

  5. def before_delete_blog(sender, instance, **kwargs):  

  6.     print( instance.title + " has been deleted ")#测试代码  

  7.   

  8. class ReadNum(models.Model):  

  9.     count = models.IntegerField(default = 0)  

  10.     blog = models.OneToOneField(Blog,on_delete = models.CASCADE)  

  11.     def __str__(self):  

  12.         return self.blog.title  

  13.     class Meta:  

  14.         #ordering = ['-created_time']  

  15.         verbose_name = '博客计数'  

  16.         verbose_name_plural = '博客计数'</span>  


我们对应着进行一下测试:


可见我们已经达成了目的,当然,这里的仅仅是一个测试的代码,大家可以根据业务需且能自定义相关操作。


总结:

好,到这里就给大家介绍了django下,实现类似触发器的效果,触发insert操作,重写模型下的save方法

触发delete方法 用到django信号机制 django删除该记录前后会发送信号,捕捉这一信号,可以定制自己的操作,实现类似触发器的效果,感谢大家

原文出处


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP