Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL 的设计与配置,View(视图)的编写,Template(模板)的设计和Form(表单)的使用。
在完成前三小节对 models 的认识,会发现在掌握了 models 的 api 基础用法,创建模型、迁移数据库、生成数据表、对数据进行增删改查。这些都是需要不断加强练习的知识点,尤其需要注意的是 ORM 的关系映射,一对一、一对多和多对多的关系。这些知识点的运用需要结合不同的业务场景对数据库进行 ORM 设计,即操作对象的属性和方法。
信号量是 Django 的一个核心知识点,在项目中很少有使用到,所以很多人都不了解或者没听过。简单来说就是在进行一些对数据操作的前后可以发出一个信号来获得特定的操作,这些操作包括
django.db.models.signals.pre_save
django.db.models.signals.post_save
在模型 save()方法调用之前或之后发送。
django.db.models.signals.pre_delete
django.db.models.signals.post_delete
在模型 delete()方法或查询集的delete() 方法调用之前或之后发送。
django.db.models.signals.m2m_changed
模型上的 ManyToManyField 修改时发送。
django.core.signals.request_started
django.core.signals.request_finished
Django开始或完成HTTP请求时发送。
在自定义用户模型类的时候,在后台添加用户数据因为使用了自定义模型类的create,所以密码会以明文保存,接下来使用信号量方式在保存后马上修改密码解决。
users/signals.py
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加载,否则不生效
from django.apps import AppConfig
class UsersConfig(AppConfig):
name = 'users'
verbose_name = "用户管理"
def ready(self):
import users.signals
进入 signals 源码
from django.db.models import signals