什么是 ORM?
Django的ORM框架对数据库操作做了如下抽象,使得定义表变为定义类,操作数据行变为操作数据行,把操作数据库的SQL方法转化为类的方法,省去了对SQL的编写。 常见类型:
- objects对象方法:get() all() filter()
- ORM对象方法 update() delete()
- 相比直接用 SQL 语句操作数据库会有性能损失,因为在映射的过程中 ORM 需要与 SQL 之间进行转换,根据对象的操作转换成 SQL 语句。
Auth
from django.contrib.auth.models import User - 创建新用户
User.objects.create_user(username='c语言中文网',password='123456',email='664104694@qq.com').save() user.set_password(password='12345abc')#会对原密码进行修改 - 认证用户:
from django.contrib.auth import authenticate from django.contrib.auth import authenticate - 还有权限 用户组等管理
视图函数
- request 是 HttpRequest 请求类型的对象,它携带了浏览器的请求信息,所以视图函数的第一个参数必须为 request。
from django.http import HttpResponse
模板
- 视图函数必须把数据形成字典的形式才可以传递给模板
- render 是 View 层加载模板的一种方式,它封装在 django.shortcuts 模块中,
render(request,"hello.html",{"vaule":"hello my Django"})
Django路由系统
- url(regex,view,name=None)
- regex,匹配请求路径,用正则表达式表示;
- view,指定 regex 匹配路径所对应的视图函数的名称;
- name,是给 url 地址起个别名,在模板反向解析的时候使用
<p><a href="{% url 'hello' %}" >点我看/a></p> 避免硬编码。path('Hello_MyWeb/<int:id>',views.Hello_MyWeb,name='hello') <p><a href="{% url 'hello' 1 %}" >点我看C语言中文网</a></p> 动态url
中间件
- 中间件本质上是一个 Python 类,类里定义了一些函数,这些函数在视图函数执行的前后调用,它们被形象的称之为“钩子函数”
- Django 同时规定了中间件的执行顺序与配置关系,请求发出自上而下,响应返回自下而上。从上至下行依次执行每一个中间件,这个过程执行两个钩子函数 process_request() 和 process_view()。但是返回响应结果的时候,整好相反,是从下至上。
- process_exception() (只有当视图引发异常时调用);
- process_template_response() (仅适用于模板响应);
- process_response()
Cache缓存系统
- 合理运用缓存技术可以减少数据库访问次数,不用每次都到数据库中读取数据,从而优化了网页的访问速度。
- Django 提供了一个健壮的缓存系统,可以保存动态页面,这样就不必每次都把相同的请求进行重复计算。并且 Django 还提供了不同级别的缓存粒度,可以缓存特定视图的输出,或者只缓存某些特定的片段,比如网站自动跳出的咨询栏等,或者也可以缓存整个站点。
- Memcached 是 Django 支持的最快、最高效的分布式高效缓存系统,它是一种完全基于内存的缓存服务器
setting.py
LANGUAGE_CODE='zh-Hans' #设置为中文模式
TIME_ZONE='Asia/Shanghai' #设置为中国时间
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'bookstoredb',
'USER': 'root',
'PASSWORD': '123456',
'HOST': '127.0.0.1',
'PORT': '3306',
}
}
项目初始化
PyMySQL 模块是 Python 的一个第三方模块, Python 3 与 MySQL 数据库的连接就是由它实现的。然后我们进行以下操作:找到 init.py 配置文件,在文件中加上如下代码:
import pymysql
pymysql.install_as_MySQLdb()
makegrations生成数据库迁移文件, makegrations生成数据库迁移文件。
ORM进阶
verbose_name 设置此字段在 admin 后台管理系统界面上的显示名称null 默认为 False,如果此选项为 False 建议加入 default 选项来设置默认值。如果设置为 True,表示该列值允许为空。日期型、时间型以及数字型字段不接受空字符串。所以当设置 IntegerField,DateTimeField 型字段可以为空时,需要将 blank 与 null 均设为 True 才可以。db_index 默认值是 False,如果设置为 True,Django 则会为该字段创建数据库索引,如果该字段经常作为查询的条件,那么就需要设置 db_index 选项,从而加快数据的检索速度。db_column 这个选项用于设置数据库表字段的名称。如果没有指定,Django 默认使用 Model 中字段的名字。choices 这个选项用于给字段设置可以选择的值。它是一个可迭代对象,即列表或者元组,其中每一个元素都是一个二元组(a,b)的形式,a 是用来选择的对象,b 是对 a 的描述信息。比如我们对某个人性别定义数据表如下所示:
class UserInfo(models.Model):
# 定义chocies参数的对应关系,以元组(或者列表)的形式进行表述:
choices = (
(male, '男性'),
(female, '女性'),
)
gender = models.CharField(max_length=2,choices = choices,default='male')
魔术方法__str__
str 方法是 Python 中的 "魔术” 方法,它是为 print 这样的打印函数设计的,它属于 python 的 object 基类的一个方法,也就是说 python 所有的类都有该方法,当然 Django 的 modle 类也有。如果没有这个方法定义,打印对象会显示对象的内存地址,但是这样的显示方式不够友好,且不利于调试,而用 str 方法后,可以在 print 时得到易于人阅读的信息,在如下所示:
# 直接print打印
class TestClass:
def __init__(self):
self.name = 'testcase'
t = TestClass() #实例化对象
print(t) # 结果显示:<__main__.TestClass object at 0x8f5c27b42367>
# __str__方法
class TestClass:
def __init__(self):
self.name = '小明'
def __str__(self):
return self.name
t = TestClass() #实例化对象
print(t) # 结果显示:小明
外键作用
外键的用途 是确保数据的完整性。它通常包括以下几种:
1、实体完整性,确保每个实体是唯一的(通过主键来实施)
2、域完整性,确保属性值只从一套特定可选的集合里选择
3、关联完整性,确保每个外键或是NULL(如果允许的话)或含有与相关主键值相配的值
模板过滤器
{{ 变量 | 过滤器1:参数值1 | 过滤器2:参数值2 ... }}
模板标签
- load 标签用于在模板中加载自定义模板标签集或者过滤器,可以加载项目中的静态文件
- extends 标签表示模板继承的标签,它通常会与{ block }标签一起使用,有具体两种使用法:
- {% extends “base.html” %} 继承名为 “base.html” 的父模板;
- {% extends variable %} 使用 variable 变量表示的模版。
- Django 模板系统也允许注释。 注释使用{# #}的格式
路由转发函数
在实际开发过程中,一个Django 项目会包含很多的 app ,这时候如果我们只在主路由里进行配置就会显得杂乱无章,所以通常会在每个 app 里,创建各自的 urls.py 路由模块,然后从根路由出发,将 app 所属的 url 请求,全部转发到相应的 urls.py 模块中。而这个从主路由转发到各个应用路由的过程叫做路由的分发,而它的实现是使用include() 函数来完成的,如下所示:
from django.urls import path,include
from BookStore import views
urlpatterns = [path('index/',include('index.urls'))]
反向解析
通过别名来指向url,可以看下面的例子
#reverse函数实现反向解析重定向到我们想要的有页面
def test_to_reverse(request):
return HttpResponseRedirect(reverse('index:detail_hello'))
#在index/urls.py中为视图函数配置路由
urlpatterns=[
path('test/',views.index_html,name='detail_hello'),
path('reverse/',views.test_to_reverse)]
path
省去正则,使用类型转换器,看例子。
#1.x url方法
url(r'^test/(?P<year>[0-9]{4})/$', views.year_test),
#2.x path方法
path('test/<int:year>/', views.year_test),
Django 默认支持 5 个类型转换器,在大多数情况下,绝对可以满足我们的正常业务需求,如果不能,Django 同样提供了自定义转换器。下面介绍 Django 默认支持的转换器,如下所示: str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式; int,匹配正整数,包含0; slug,匹配字母、数字以及横杠、下划线组成的字符串; uuid,匹配格式化的 uuid,如 075194d3-6885-417e-a8a8-6c931e272f00; path,匹配任何非空字符串,包含了路径分隔符。
|