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

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

作者头像
小团子
发布2019-07-30 13:11:39
1K0
发布2019-07-30 13:11:39
举报
文章被收录于专栏:数据云团

Django源码学习-3-Model-下

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

在完成前三小节对 models 的认识,会发现在掌握了 models 的 api 基础用法,创建模型、迁移数据库、生成数据表、对数据进行增删改查。这些都是需要不断加强练习的知识点,尤其需要注意的是 ORM 的关系映射,一对一、一对多和多对多的关系。这些知识点的运用需要结合不同的业务场景对数据库进行 ORM 设计,即操作对象的属性和方法。

信号量是 Django 的一个核心知识点,在项目中很少有使用到,所以很多人都不了解或者没听过。简单来说就是在进行一些对数据操作的前后可以发出一个信号来获得特定的操作,这些操作包括

代码语言:javascript
复制
django.db.models.signals.pre_save
django.db.models.signals.post_save

在模型 save()方法调用之前或之后发送。
代码语言:javascript
复制
django.db.models.signals.pre_delete
django.db.models.signals.post_delete

在模型 delete()方法或查询集的delete() 方法调用之前或之后发送。
代码语言:javascript
复制

django.db.models.signals.m2m_changed
模型上的 ManyToManyField 修改时发送。

django.core.signals.request_started
django.core.signals.request_finished

Django开始或完成HTTP请求时发送。

在自定义用户模型类的时候,在后台添加用户数据因为使用了自定义模型类的create,所以密码会以明文保存,接下来使用信号量方式在保存后马上修改密码解决。

users/signals.py

代码语言:javascript
复制
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.contrib.auth import get_user_model
from utils.create_time_str import CreateIdView

User = get_user_model()
id_time_str = CreateIdView()

@receiver(post_save, sender=User)
def create_user(sender, instance=None, created=False, **kwargs):
    """
    sender:模型类。
    instance:保存的实际实例。
    created:如果创建了新记录True。
    update_fields:Model.save()要更新的字段集,如果没有传递则为None
    """
    if created:
        password = instance.password
        instance.set_password(password)
        instance.open_id = id_time_str.create_time_stamp()
        instance.save()

users/apps.py

使用ready加载,否则不生效

代码语言:javascript
复制
代码语言:javascript
复制
from django.apps import AppConfig

class UsersConfig(AppConfig):
    name = 'users'
    verbose_name = "用户管理"

    def ready(self):
        import users.signals

进入 signals 源码

代码语言:javascript
复制
from django.db.models import signals
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-07-26,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档