django框架(一)
一、基本信息及demo
1、虚拟环境下 安装django
pip install django==1.11.16
2.检查django是否安装成功
1. pip list
2.进入交互模型
import django
django.get_version() 查看到对应版本,则证明安装成功
3.创建django项目
1、创建django工程
django-admin startproject 项目名
进入到项目目录下 执行 python manage.py runserver
可以开启服务器,开启后再浏览器中可以访问;本地访问
2.创建一个应用(在项目目录下开启)
python manage.py startapp 应用名
3.pycharm打开选择manage.py的父目录打开即可
3.项目下各目录及.py介绍
1.app --- 应用名, 可以自定义,也可以创建,可以创建多个(小项目)
1.migrations 目录, 迁移目录,是自动生成的,通常是生成数据库表的时候产生中间文件
2.__init__.py 初始化包的时候调用,是一个包的标识
3.admin.py 管理项目数据库的
4.apps 管理应用的
**5.models.py models数据模型, 通常用来方便的操作数据库
6.tests.py 测试的时候用, 往往开发完成的时候测试人员使用
**7.views.py 视图函数, 通常用来处理业务逻辑 python代码
2.week01--- 项目名, 放置管理整个项目的一些配置文件
1.setting.py 整个项目的配置
**2.urls.py 路由, 用来分发请求的url,将对应的url分发到对应views处理
3. wsgi.py 是uwsgi服务器的配置文件,开发完成上线的时候使用
3.db.sqlite3 数据库
4.manage.py 项目的配置文件,通常启动,生成数据库的时候使用,自动生成的自己创建的
**5.templates目录模板,通常用来放置html模板
4.settting 文件介绍
BASE_DIR : 项目的跟路径
DEBUG : 是否开启调试模式, 开发的时候开启, True 开启,false关闭
ALLOWED_HOSTS: 允许访问的主机地址,
默认只能本机访问,
["*"] 表示所有的地址都可以访问
INSTALLED_APPS 已经安装的应用, 注意: 自己创建的应用需要添加进去
MIDDLEWARE 中间健
TEMPLATES 模板文件的配置
DATABASES 配置数据库的
LANGUAGE_CODE 配置语言的 中文: "zh-hans"
TIME_ZONE 配置时区的 中国: "Asia/Shanghai"
STATIC_URL 配置静态资源的
5.外网访问开发服务器
1.如果是宿主机访问虚拟机需要设置网络 为 桥接模式
2.启动服务器:
1.在setting中设置 ALLOWED_HOSTS为 ["*"]
2.使用 python manage.py runserver 0.0.0.0:端口号 2018/9/10来开启
则即可使用外网访问
**命令 : python manage.py runserver 表示默认只能自己访问
6.demo-helloworld
流程: urls ----> views 视图函数 ----> template html文件 --->views 视图函数响应
开发流程: 倒着来 目的
1.template 模板中写到要展示的html网页
2.views 视图函数中响应一个html, 如: return render(request,"模板名")
3.urls 将url路径与视图函数对应即可
3.model 模型
作用: model模型, 通常用来方便的操作数据库: 1.可以方便的创建表 2.方便的增删改查 3.可以方便的在views中使用
1.设计表:
字段1,字段2,....... ---> sql: create table 表名(字段 字段类型,........)
在django中直接写对应model模型,就可以自动的生成表
如:
# 定义一个学生类
# 注意: modle中定义的类需要继承 models.Model
class Student(models.Model):
s_name = models.CharField(max_length=50)
s_age = models.IntegerField(default=18)
2.需要执行迁移才能自动生成对应的表
1.生成迁移文件
命令: python manage.py makemigrations
2.执行迁移文件
命令: python manage.py migrate
3.执行迁移后,刷新后就可以看到自动创建的表
注意;首次执行迁移时,还会创建django项目需要的表
3.如何连接数据库:
pycharm 右侧----->database ---> + ---->import from source ---->test connect 如果不能点,需要点击下方的downlosd下载对应的驱动,--->再点击test connect--->成功后确定即可连接上
4.如何使用pycharm管理数据库
1.双击表名可以查看 表的所有数据
2.插入/删除 一条数据 点击表的上方的 +/-按钮, 注意操作完后必须提交(db绿色向上箭头)才可生效
3.注意:pycharm的数据操作后不会自动的刷新,开发测试数据的时候,需要手动刷新,来查看数据
4.ddl按钮可以查看表的创建语句
5.黑色图标的按钮, ---> new console --->可以输入sql语句 --->绿色按钮是执行
可以方便的操作数据库
二、MVC/MTV
M — model 数据模型层
作用:方便的操作数据库
1.连接数据库 ---- mysql,sqlserver, oracle…
0.django默认只能连接关系型数据库
1.安装依赖的库
可以使用的库: 1. pymysql 2.python_mysql(不稳定) 3.mysqlclient(配置麻烦)
安装pymsql: pip install pymysql
如果出现 timeout 超时可以使用其他的资源下载: pip install 模块名 -i https://pypi.douban.com/simple
2. 导入库
在 __init__文件中编写:
# 导入pymysql模块
import pymysql
pymysql.install_as_MySQLdb()
3.在setting的database中配置mysql的连接
'ENGINE': 'django.db.backends.mysql', 设置驱动
'NAME':"week01", 设置数据库名
'USER':'root', 设置用户名
'PASSWORD':'123', 设置密码
'HOST':'localhost', 设置主机地址
'PORT':3306, 设置端口号
**4.注意:不要忘记了在数据库中创建该库
create database 数据库名 charset='utf8';
5.连接mysql数据库
点击左侧database --- + -----data source ----数据库类型(如:mysql) ----- 设置 账号,密码,主机,(注意: 如果对mysql设置远程连接,需要使用远程连接的账号密码)
----test connect ---- successful 即可
6.测试程序能否能连
1.执行迁移
python manage.py makemigrations
python manage.py migrate
2.看到自动生成的表即可
2.orm 对象关系隐射 — 思想:相当于一个翻译机
object relational mapping
1.开发人员不要写复杂的sql语句,直接调用对应的方法即可
2.开发人员不需要封装查询结果,查询结果直接就是对象,可以直接使用
3.如果开发人员需要跟换数据库, 不需要更改任何的代码,直接修改数据库的连接即可
3.创建一个表
1.需要在model模块中创建一个类,注意该类必须继承 models.Model,
注意: 表名默认是 应用名_类名
2.定义属性名 ---属性需要与表中字段对应
字段名即属性名
字段的数据类型
字段的约束类型
·django根据属性的类型确定以下信息
·当前选择的数据库支持字段的类型
·渲染管理表单时使用的默认html控件
·在管理站点最低限度的验证
·django会为表增加自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后,则django不会再生成默认的主键列
·属性命名限制
·遵循标识符规则
·由于django的查询方式,不允许使用连续的下划线
库
·定义属性时,需要字段类型,字段类型被定义在django.db.models.fields目录下,为了方便使用,被导入到django.db.models中
·使用方式
·导入from django.db import models
·通过models.Field创建字段类型的对象,赋值给属性
逻辑删除
·对于重要数据都做逻辑删除,不做物理删除,实现方法是定义isDelete属性,类型为BooleanField,默认值为False
字段类型
·AutoField
·一个根据实际ID自动增长的IntegerField,通常不指定如果不指定,一个主键字段将自动添加到模型中
·CharField(max_length=字符长度)
·字符串,默认的表单样式是 TextInput
·TextField
·大文本字段,一般超过4000使用,默认的表单控件是Textarea
·IntegerField
·整数
·DecimalField(max_digits=None, decimal_places=None)
·使用python的Decimal实例表示的十进制浮点数
·参数说明
·DecimalField.max_digits
·位数总数
·DecimalField.decimal_places
·小数点后的数字位数
·FloatField
·用Python的float实例来表示的浮点数
·BooleanField
·true/false 字段,此字段的默认表单控制是CheckboxInput
·NullBooleanField
·支持null、true、false三种值
·DateField([auto_now=False, auto_now_add=False])
·使用Python的datetime.date实例表示的日期
·参数说明
·DateField.auto_now
·每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为false
·DateField.auto_now_add
·当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为false
·说明
·该字段默认对应的表单控件是一个TextInput. 在管理员站点添加了一个JavaScript写的日历控件,和一个“Today"的快捷按钮,包含了一个额外的invalid_date错误消息键
·注意
·auto_now_add, auto_now, and default 这些设置是相互排斥的,他们之间的任何组合将会发生错误的结果
·TimeField
·使用Python的datetime.time实例表示的时间,参数同DateField
·DateTimeField
·使用Python的datetime.datetime实例表示的日期和时间,参数同DateField
·FileField
·一个上传文件的字段
·ImageField
·继承了FileField的所有属性和方法,但对上传的对象进行校验,确保它是个有效的image
字段选项
·概述
·通过字段选项,可以实现对字段的约束
·在字段对象时通过关键字参数指定
·null
·如果为True,Django 将空值以NULL 存储到数据库中,默认值是 False
·blank
·如果为True,则该字段允许为空白,默认值是 False
·注意
·null是数据库范畴的概念,blank是表单验证证范畴的
·db_column
·字段的名称,如果未指定,则使用属性的名称
·db_index
·若值为 True, 则在表中会为此字段创建索引
·default
·默认值
·primary_key
·若为 True, 则该字段会成为模型的主键字段
·unique
·如果为 True, 这个字段在表中必须有唯一值
关系
·分类
·ForeignKey:一对多,将字段定义在多的端中
·ManyToManyField:多对多,将字段定义在两端中
·OneToOneField:一对一,将字段定义在任意一端中
·用一访问多
·格式
·对象.模型类小写_set
·示例
grade.students_set
·用一访问一
·格式
·对象.模型类小写
·示例
·grade.students
·访问id
·格式
·对象.属性_id
·示例
·student.sgrade_id
-
案例:
# 定义模型 # 注意: 执行迁移后,才会在数据库自动创建对应的表 #默认的表名为: 应用名_类名 类名会自动转换成全小写 可以使用(内部类): class Meta: db_table = "表名" 修改表名 # 默认的字段名 就是 定义的属性名, 可以使用 db_column = "字段名" 来修改字段名 # 默认会自动创建主键id,如果使用AutoField则不会自动创建 class Person(models.Model): p_name = models.CharField(max_length=20,null=False,unique=True) p_age = models.IntegerField(default=10) p_sex = models.BooleanField(default=True) # .... # 表的结构是可以修改的,修改后,需要重新的迁移才能生效,最好不要修改 # 注: 会自动的检测那些属性进行了修改
4.增加一个数据 view里创建一个函数,实例化
1.创建一个对象
2.设置属性
3.保存数据
对象名.save()
5.删除数据— delete from 表名 whree 条件
0.要删除数据,前提条件是先查询到对应的数据
1.删除:
# 可以直接删除多个结果,也可以直接删除一个
查询结果.delete()
6.修改数据 ---- update 表名 set 字段名=数据,… where 条件
0.要修改数据,前提条件也是先查询到对应的数据
1.修改:
对象名.属性名 = 值
对象名.save()
7.查询数据
1.查询方法 格式: 类名.objects.方法 ----支持链式调用
1.有多条结果的
all() 获取所有的结果
filter(条件) 按照条件筛选数据
exclude(条件) 筛选出满足条件以外的数据
2.有单个结果的
first() 获取结果集的第一个
last() 获取结果集的最后一个
get() 获取一个结果, 注意: 有且只有一个结果的时候使用get()才可以,如果结果超过一个或者没有,程序都出错
3.其他
count() 获取结果集的数量
order_by("-属性名") 表示按照属性名对应的值排序, 默认是升序, -属性名表示降序排序
如果是字符类型的数据,是按照字符对应的码表来排序的,一个字符一个字符的的比较,如: "aac" "abc" ,"aac"小,
exists() 判断查询结果集中是否有数据
values() 获取结果集的数据,该数据是类似字典的形式,方便操作
2.条件中的运算符
格式: 属性名__运算符=值 是2个下划线
运算符:
gt 大于
gte 大于等于
lt 小于
lte 小于等于
= 等于 exact
不等于 exclude(条件)
isNull 是空的数据
startwith 查询以某个字符开始
endwith 查询以某个字符结尾的
contain 查询包含某个字符的
istartwith i 是ignore的简写, 忽略大小写查询
iendwith
icontain
in 成员运算符, 是否是集合中值的其中一个,满足一个就符合条件
特使用法** pk=值 pk是主健的简写
3.Q与F对象
1.Q对象, 用来帮助实现 逻辑运算符
& 且 如: ...filter(Q(p_age__gt=90)&Q(p_age__lt=95)) 注意导包
| 或 如: ....filter(Q(p_name="三胖胖40") | Q(p_name="三胖胖61"))
~ 非 如: ....filter(~Q(p_age__lte=100))
2.F 对象, 用来帮助自己的属性与自己的属性比较
如:
# 需求:实现年龄比id小的数据
persons = Person.objects.filter(p_age__lt=F("id"))
4.查询结果的切片
格式: 结果集[start:stop] 包前不包后 截取从start位置到stop位置的数据
5.聚合函数的使用
Max
Min
Avg
Sum
注意: 1.大小写 2.注意到包
如:
# 求年龄最大的
# res = Person.objects.all().aggregate(Max("p_age"))
res = Person.objects.all().aggregate(Min("p_age"))
如何将urls中的内容分离 ?
1.问题: 如果所有的urls路由都写在项目下的urls中,难以管理,不同应用之间还可能出现冲突
2.解决: 将项目的urls 中的内容分离
3.如何分离:
1.在应用目录下创建一个urls.py,代码与项目下的urls类似
2.在应用下的urls中可以添加自己引用对应的路由
如: url("路径",对应的视图函数)
3.还需要在项目的urls中添加应用的urls
如: url("应用名",include("应用名.urls"))
注意:1.倒包 2.注意引号 3.注意 /
4.访问格式: /应用名/路径