Signals 顾名思义,就是信号的意思。 python
Django的signals能够用来干什么呢?好比,论坛中别人给你发了一条消息,自动产生一个消息对象。 数据库
咱们先来自定义一个信号 django
Message应用中的models.py 函数
from django.db import models from django.contrib.auth.models import User from django.dispatch import Signal notice_signal = Signal(providing_args=['reciver']) #自定义信号 class Message(models.Model): sender = models.ForeignKey(User) content = models.CharField(max_length=50) def newMessage(self,reciver): notice_signel.send(sender=self.__class__,reciver=reciver) #发出信号Notice应用中的models.py
from django.db import models from django.contrib.auth.modesl import User from Message.models import notice_signal class Notice(models.Model): reciver = models.ForeignKey(User) def sendNotice(sender,reciver,**kwargs): Notice.create(reciver=reciver) notice_signal.connect(sendNotice,sender=Message) #接收信号
这样,只有在建立一个Message对象后,调用newMessage函数,就会自动建立一个Notice对象,实现相似新消息通知的功能。 post
更复杂的一个例子,我说我要学习,学什么呢,学数据库(一个model),算是学习,学一门语言(另一个model)也算是学习。我但愿每学同样东西,会自动产生一个学习事件model。这样我在查询我所学的知识时,只须要对学习事件进行查询就可以方便获取全部学过的东西的对象。 学习
models.py spa
from django.db import models from django.contrib.auth.modesl import User from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes import generic Class StudyEvent(models.Model): #如下三个成员必须指定 content_type = models.ForeignKey(ContentType) object_id = models.PositiveIntegerField() content_object = generic.GenericForeignKey('content_type', 'object_id') #其它须要字段 user = models.ForeignKey(User) start_time = models.models.DateTimeField(auto_now=True) #…… class StudyDatabase(models.Model): content = models.CharField(max_length=50) class StudyLanguage(models.Model): content = models.CharField(max_length=50)由于有时候学数据库和学一门语言要包含一些不一样字段,因此须要两个models。
而后,让咱们来添加Signal code
models.py 对象
#头部添加 from django.db.models.signals import post_save #即对象在建立时会发出的信号 #尾部 def autoCreateStudyEvent(sender,**kwagrs): instance = kwargs.get('instance') if instance.__class__.__name__ == 'StudyDatabase': studyevent = StudyEvent.create(content_object=instance) elif instance.__class__.__name__ == 'StudyLanguage': studyevent = StudyEvent.create(content_object=instance) post_save.connect(autoCreateStudyEvent,sender=StudyDatabase) post_save.connect(autoCreateStudyEvent,sender=StudyLanguage)
这样,在建立StudyDatebase和StudyLanguage时会自动建立相应的StudyEvent对象。 事件
如今,例若有一个用户叫user1,获取它全部学过的东西只须要:
import datetime user1 = User.objects.get(username="user1") studyevents = user1.studyevent_set.filter(start_time=datetime.datetime(2013,8,11)) #获取在8月11日学到的知识 for studyevent in studyevents: print studyevent.content_object
这样的好处在于,之后添加了新的models,在获取全部所学过的知识时,不须要从新添加不少代码。
很久没更新博客了,深夜更新暂时写这么多,有错漏请指正。
转载请注明出处,谢谢!