前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Django实战-Signals 信号量

Django实战-Signals 信号量

作者头像
小团子
发布2019-10-18 02:02:44
7400
发布2019-10-18 02:02:44
举报
文章被收录于专栏:数据云团

Django实战-多对多查询

Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL 的设计与配置,View(视图)的编写,Template(模板)的设计和Form(表单)的使用。

代码语言:javascript
复制
from django.db.models import signals

django的signal结合contenttypes可以实现好友最新动态,新鲜事,消息通知等功能。这个功能在用户发生某个动作的时候将其记录下来或者附加某些操作,比如通知好友。要实现这种功能可以在动作发生的代码里实现,也可以通过数据库触发器等实现,但在django中,可以使用signals。

记录每个操作,同时还能追踪到这个操作的具体动作:

① 用信号机制,监听信号,实现对信号的响应函数,在响应函数中记录发生的动作。

② 为了能追踪到操作的具体动作,必须从这张表中得到相应操作的model,这就得用ContentType。

在新鲜事这个功能上,使用GenericRelation来产生一个特殊的外键,它不像models.ForeignKey那样,必须指定一个Model来作为它指向的对象,GenericRelation可以指向任何Model对象。

代码语言:javascript
复制
from django.db import modelsfrom django.contrib.auth.models import Userfrom django.contrib.contenttypes import fieldsfrom django.db.models import signals
代码语言:javascript
复制
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()
代码语言:javascript
复制
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函数,可以在这个接受函数中实现通知好友等功能。

往期回顾

Django源码学习-4-Signals 信号量

Django源码学习-25-ContentType

Django实战-信息资讯-付费资讯基础模型

Django实战-生鲜电商-删除购物车数据|退出

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-10-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据云团 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档