Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL 的设计与配置,View(视图)的编写,Template(模板)的设计和Form(表单)的使用。
from django.db.models import signals
django的signal结合contenttypes可以实现好友最新动态,新鲜事,消息通知等功能。这个功能在用户发生某个动作的时候将其记录下来或者附加某些操作,比如通知好友。要实现这种功能可以在动作发生的代码里实现,也可以通过数据库触发器等实现,但在django中,可以使用signals。
记录每个操作,同时还能追踪到这个操作的具体动作:
① 用信号机制,监听信号,实现对信号的响应函数,在响应函数中记录发生的动作。
② 为了能追踪到操作的具体动作,必须从这张表中得到相应操作的model,这就得用ContentType。
在新鲜事这个功能上,使用GenericRelation来产生一个特殊的外键,它不像models.ForeignKey那样,必须指定一个Model来作为它指向的对象,GenericRelation可以指向任何Model对象。
from django.db import modelsfrom django.contrib.auth.models import Userfrom django.contrib.contenttypes import fieldsfrom django.db.models import signals
class Post(models.Model): author = models.ForeignKey(User, on_delete=models.CASCADE) title = models.CharField(max_length=255) content = models.TextField() created = models.DateTimeField(u'发表时间', auto_now_add=True) updated = models.DateTimeField(u'最后修改时间', auto_now=True)
events = fields.GenericRelation('Event')
def __str__(self): return self.title
def description(self): return u'%s 发表了文章《%s》' % (self.author, self.title)
class Event(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE) content_type = models.ForeignKey(ContentType, on_delete=models.SET_NULL) object_id = models.PositiveIntegerField()
content_object= fields.GenericForeignKey('content_type', 'object_id')
created = models.DateTimeField(u'事件发生时间', auto_now_add=True)
def __str__(self): return "%s的事件: %s" % (self.user, self.description())
def description(self): return self.content_object.description()
def post_post_save(sender, instance, signal, *args, **kwargs): """ :param sender:监测的类:Post类 :param instance: 监测的类:Post类 :param signal: 信号类 :param args: :param kwargs: :return: """ post = instance event = Event(user=post.author, content_object=post) event.save()
signals.post_save.connect(post_post_save, sender=Post)
只要model中有object的保存操作,都将执行post_post_save函数,可以在这个接受函数中实现通知好友等功能。
往期回顾