Django 精要

什么是 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,匹配任何非空字符串,包含了路径分隔符。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值