django的信号使用疑问
高洛峰
高洛峰 2016-11-14 11:11:01
0
2
754

我想在模型保存和删除数据时候进行一些其他操作。查看文档,模型的保存可以重写。类似如下

models.py

class owgameserver(models.Model):
    serverid = models.IntegerField(u"游戏服ID号",primary_key=True)
    serverhost = models.GenericIPAddressField(u"游戏服IP")
    servername = models.CharField(u"游戏服名称",max_length=32)
    serverport = models.IntegerField(u"游戏服端口号")

    def save(self,*args,**kwargs):
        print '添加新服:服id:%s-服ip:%s-服名称:%s-服端口:%s' %(self.serverid,self.serverhost,self.servername,self.serverport)
        super(owgameserver,self).save(*args,**kwargs)
        print ansible_owgameserver_file
        ansiblefile = open(ansible_owgameserver_file,'a')
        ansiblefile.write('ow%s ansible_ssh_host=%s server_port=%s server_id=%s' %(self.serverid,self.serverhost,self.serverport,self.serverid))
        ansiblefile.close()
        print '添加完成.'

然后想写删除时候,发现文档是提供了信号来处理
然后我的处理如下
single.py

from models import owgameserver
from django.dispatch import receiver
from django.db.models.signals import post_delete,post_save


def del_ansible_host(sender,**kwargs):
    print '删除文件中的列表'
post_delete.connect(del_ansible_host,sender=owgameserver)


def save_ansible_host(sender,**kwargs):
    print '保存内容'
post_save.connect(save_ansible_host,sender=owgameserver)

然后发现,无论我是添加新的内容,还是删除内容都无法触发这两个信号里的内容,这是为咋的?

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

Antworte allen(2)
学霸

首先,先确保你的single.py 有被import过,这样django才能读取到你里面的注册的signals.

post_save 顾名思义,是在save操作之后触发。也即当你调用 model.save(),执行保存后触发。update方法不会触犯该signals.

post_delete,是在delete操作之后触发。也就是当你调用model.delete(),model删除后才会触发。.filter().delete() 不会触发该signals.


三叔

bVD4qj.png

在实操中,sigal handler写在signals模块下面。

然后需要在app的ready()方法中引用这些handlers。


Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!