1. DJANGO使用指南
Django简介:
Django发布于2005年7月,是当前Python世界里最有名且成熟的网络框架。 最初是被开发用于管理劳伦斯出版集团旗下的以新闻内容为主的网站的,即CMS(内容管理系统)软件。
Django是一个用Python编写的开放源代码的Web应用框架,代码是开源的。此系统采用了MVC的框架模式, 也可以称为MTV模式
什么是MVC模式
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。 通俗的来讲就是,强制性的使应用程序的输入,处理和输出分开。
核心思想</b>:解耦
<b>优点</b>:减低各个模块之间的耦合性,方便变更,更容易重构代码,最大程度的实现了代码的重用
MVC(Model, View, Controller)
Model: 即<font color=red>数据存取层</font>。用于封装于应用程序的业务逻辑相关的数据,以及对数据的处理。说白了就是模型对象负责在数据库中存取数据
View: 即<font color=red>表现层</font>。负责数据的显示和呈现。渲染的html页面给用户,或者返回数据给用户。
Controller: 即业务逻辑层。负责从用户端收集用户的输入,进行业务逻辑处理,包括向模型中发送数据,进行CRUD操作。
图解:
浏览器中MVC的表现形式图解:
Django的模式简介
MVT模式
严格来说,Django的模式应该是MVT模式,本质上和MVC没什么区别,也是各组件之间为了保持松耦合关系,只是定义上有些许不同。
Model: 负责业务与数据库(ORM)的对象
View: 负责业务逻辑并适当调用Model和Template
Template: 负责把页面渲染展示给用户
注意: Django中还有一个url分发器,也叫作路由。主要用于将url请求发送给不同的View处理,View在进行相关的业务逻辑处理。
2. VIRTUALENV虚拟环境创建指南
前言
本教程中使用到的python版本均为python3.x版本,由于本人安装的是python3.6.3版本,所以一下的课程均是在此基础上进行的。
virtualenv使用场景:当开发成员负责多个项目的时候,每个项目安装的库又是有很多差距的时候,会使用虚拟环境将每个项目的环境给隔离开来。
比如,在有一个老项目已经开发维护了3年了,里面很多库都是比较老的版本了。例如python使用的是2.7版本的。但是新项目使用的python版本是3.6的。为了解决这种项目执行环境的冲突,所以引入了虚拟环境virtualenv。
当然除了virtualenv可以起到隔离环境的作用,还有其他技术方案来实现,而且上线流程简单,大大减轻运维人员的出错率,比如每一个项目使用一个docker镜像,在镜像中去安装项目所需的环境,库版本等等
python环境的配置
1.在cmd中能通过python去启动,如果不行直接跳到第三步
2.在cmd中能通过pip3启动安装软件,如果不行直接跳到第三步
3.配置python环境和pip环境
4.确认pip安装成功,如果Scritp文件夹下没有pip可执行文件,则执行第五步。
5.由于python3.6安装以后,在Scripts文件中没有pip的可执行软件,需要输入一下命令进行安装
python -m ensurepip
windows中安装使用
- 安装virtualenv
pip install virtualenv
- 创建虚拟环境
先查看一下安装虚拟环境有那些参数,是必须填写的
注意两个参数:
--no-site-packages和-p参数
virtualenv --no-site-package venv
以下是指定安装虚拟环境中的python版本的安装方式:
- 进入/退出env
进入 cd env/Scripts/文件夹 在activate命令
退出 deactivate
ubuntu中安装使用
- 安装virtualenv
apt-get install python-virtualenv
- 创建包含python3版本的虚拟环境
virtualenv -p /usr/bin/python3 env
env代表创建的虚拟环境的名称
- 进入/退出env
进入 source env/bin/activate
退出 deactivate
-
pip使用
查看虚拟环境下安装的所有的包
pip list
-
查看虚拟环境重通过pip安装的包
pip freeze
3. DJANGO使用指南
创建Django项目
1. 首先创建一个运行Django项目的虚拟环境(virtualenv)
虚拟环境的创建在基础课程中讲解,地址
该虚拟环境中有django库,python3,pymysql等等需要的库
大致在罗列下安装了那些库:
pip install Django==1.11
pip install PyMySQL
2. 创建一个Django项目
2.1 创建项目
django-admin startproject halloWorld
该命令是创建一个名为halloWorld的工程
项目目录介绍
下面展示创建以后的文件,具体有哪些文件:
manage.py: 是Django用于管理本项目的管理集工具,之后站点运行,数据库自动生成,数据表的修改等都是通过该文件完成。
init.py: 指明该目录结构是一个python包,暂无内容,在后期会初始化一些工具会使用到。
seetings.py: Django项目的配置文件,其中定义了本项目的引用组件,项目名,数据库,静态资源,调试模式,域名限制等
urls.py:项目的URL路由映射,实现客户端请求url由哪个模块进行响应。
wsgi.py:定义WSGI接口信息,通常本文件生成后无需改动
2.2 运行Django项目
python manage.py runserver 端口
该命令是运行项目,端口可以不用写,启动的时候会默认随机创建一个可以使用的端口
2.2 创建app
python manage.py startapp hallo_app
该命令是在blog工程下创建一个名为hallo_app的app
3. settings.py配置文件详细解读
a) 设置语言:
LANGUAGE_CODE = 'zh-hans' 表示中文
LANGUAGE_CODE = 'en-us' 表示英文
设置时区: TIME_ZONE = 'Asia/Shanghai'
b) 时区解释: (需要详细回顾思考时区问题)
UTC:世界标准时间,也就是平常说的零时区。
北京时间表示东八区时间,即UTC+8
模型使用指南--models
前言
Django对数据库提供了很好的支持,对不同的数据库,django提供了统一调用的API,我们可以根据不同的业务需求使用不同是数据库。Django中引入了ORM(Objects Relational Mapping)对象关系映射,是一种程序技术。在下面会详细的讲解。
修改mysql配置
1. 在settings.py中配置数据库连接信息
'ENGINE':'django.db.backends.mysql',
'NAME':'', #数据库名
'USER':'', #账号
'PASSWORD':'', #密码
'HOST':'127.0.0.1', #IP(本地地址也可以是localhost)
'PORT':'3306', #端口
2. mysql数据库中创建定义的数据库
a) 进入mysql
mysql -u root -p
b) 创建数据库
create database xxx charset=utf-8;
3. 配置数据库链接
a) 安装pymysql
pip install pymysql
b) 在工程目录下的init.py文件中输入,完成数据库的驱动加载
import pymysql
pymysql.install_as_MySQLdb()
4. 定义模型
重要概念:模型,表,属性,字段
一个模型类在数据库中对应一张表,在模型类中定义的属性,对应模型对照表中的一个字段
定义属性见定义属性文件地址
创建学生模型类
class Student(models.Model):
# 长度为10,且唯一不能为空的姓名s_name字段 CharField - 字符串类型
s_name = models.CharField(max_length=10, unique=True, null=False)
# IntegerField - 整型字段
age = models.IntegerField(default=18)
# auto_now_add:表示第一次创建数据时,自动默认为创建的时间
create_time = models.DateTimeField(auto_now_add=True)
# auto_now: 表示修改时,自动更新为修改时间
operate_time = models.DateTimeField(auto_now=True)
# 是否删除
is_delete = models.BooleanField(default=0)
class Meta:
db_table = 'student'
其中:
字段定义:
DateTimeField - 年月日时分秒
DateFiled - 年月日
TimeFiled - 时间戳(较好,不分时区的, 上面都要分)
ImageFiled - 只需要图片的路径
TextFiled - 存文本, texteare
AutoFiled - 自增的字段, 不用定义, 它会自动生成一个,如上面的id
FloatFiled - 浮点数
DecimalFiled - 指定长度的浮点数 5位数, 小数点占两位, 999.99
约束定义:
max/min_length - 最大/最小长度
unique - 唯一
null - 是否为空
default - 默认值
auto_now_add和auto_now 只能选其中一个
5.迁移数据库
a) 生成迁移文件
python manage.py makemigrations
注意:如果执行后并没有生成迁移文件,一直提示No changes detected这个结果的话,就要手动的去处理了。有两点处理方式:
1) 先删除掉pycache文件夹
2) 直接强制的去执行迁移命令,python manage.py makemigrations xxx (xxx就是app的名称)
3) 查看自动生成的数据库,查看表django_migrations,删掉app字段为xxx的数据(xxx就是app的名称)
b) 执行迁移生成数据库
python manage.py migrate
注意: 生成迁移文件的时候,并没有在数据库中生成对应的表,而是执行migrate命令之后才会在数据库中生成表
6. ORM
ORM(Objects Relational Mapping)对象关系映射,是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。可以简单理解为翻译机。
7.模型查询
a) 模型成员objects
Django默认通过模型的objects对象实现模型数据查询
b) 过滤器
查询集表示从数据库获取的对象集合
查询集可以有多个过滤器
过滤器就是一个函数,基于所给的参数限制查询的结果
从SQL角度来说,查询集合和select语句等价,过滤器就像where条件
Django有两种过滤器用于筛选记录
filter : 返回符合筛选条件的数据集
exclude : 返回不符合筛选条件的数据集
多个filter和exclude可以连接在一起查询
当然还有如下这些过滤器:
all() 返回所有数据
filter() 返回符合条件的数据
exclude() 过滤掉符合条件的数据
order_by() 排序
values() 一条数据就是一个字典,返回一个列表
c) 查询单个数据
get():返回一个满足条件的对象。如果没有返回符合条件的对象,会应该模型类DoesNotExist异常,如果找到多个,会引发模型类MultiObjectsReturned异常
first():返回查询集中的第一个对象
last():返回查询集中的最后一个对象
count():返回当前查询集中的对象个数
exists():判断查询集中是否有数据,如果有数据返回True,没有返回False
d) 限制查询集
限制查询集,可以使用下表的方法进行限制,等同于sql中的limit
模型名.objects.all()[0:5] 小标不能为负数
e) 字段查询
对sql中的where实现,作为方法,filter(),exclude(),get()的参数
语法:属性名称__比较运算符 = 值
外键:属性名_id
注意:like语句中使用%表示通配符。比如sql语句查询 where name like '%xxx%',等同于filter(name_contains='xxx')
f) 比较运算符
contains:是否包含,大小写敏感
startswith,endswith:以values开头或者结尾,大小写敏感
以上的运算符前加上i(ignore)就不区分大小写了
isnull,isnotnull:是否为空。filter(name__isnull=True)
in:是否包含在范围内。filter(id__in=[1,2,3])
gt,gte,lt,lte:大于,大于等于,小于,小于等于。filter(age__gt=10)
pk:代表主键,也就是id。filter(pk=1)
g) 聚合函数
agregate()函数返回聚合函数的值
Avg:平均值
Count:数量
Max:最大
Min:最小
Sum:求和
例如: Student.objects.aggregate(Max('age'))
h) F对象/Q对象
F对象:可以使用模型的A属性与B属性进行比较
背景:在模型中有两个字段,分别表示学生成绩A与成绩B,要对成绩AB进行比较计算,就需要使用到F对象。
例如有如下例子1:
# 比较大小: 添加两个字段yuwen, math 用F比较
# sql: select * form student where yuwen > math;
stus = Student.objects.filter(yuwen__gt=F('math'))
# 语文比数学成绩大10分的学生
stus = Student.objects.filter(yuwen__gt=F('math') + 10)
print(stus)
F对象支持算数运算
Q对象
Q()对象就是为了将过滤条件组合起来
当我们在查询的条件中需要组合条件时(例如两个条件“且”或者“或”)时。我们可以使用Q()查询对象
使用符号&或者|将多个Q()对象组合起来传递给filter(),exclude(),get()等函数
Q()对象的前面使用字符“~”来代表意义“非”
# Q, 且, 或, 非
stus = Student.objects.filter(s_name__contains='花', age=23).all()
# 或者条件
stus = Student.objects.filter(Q(s_name__contains='花') | Q(age=23)).all()
print(stus)
# ~非 没有包含花的学生
stus =Student.objects.filter(~Q(s_name__contains='花')).all()
stus =Student.objects.exclude(s_name__contains='花').all() # 和上面效果一样
print(stus)
例子1:
查询学生中不是12岁的或者姓名叫张三的学生
student = Student.objects.filter(~Q(age=12) | Q(name='张三'))
例子2:
查询python班语文小于80并且数学小于等于80的学生
grade = Grade.objects.filter(g_name='python').first()
students = grade.student_set.all()
stu = students.filter(~Q(s_yuwen__gte=80) & Q(s_shuxue__lte=80))