Django:
*各语言通用web架构MVC
Model(模型): 数据存储层, 管理数据的.
View(视图): 表现层, 展示页面内容.
Controller(控制器): 业务逻辑层, 中间调节人.
*Python的web架构MTV(各模块与MVC只是名字叫法不一样, 功能是一样的)
Model(模型): 数据存储层.
Templete(模板): 表现层.
View(视图): 业务逻辑层.
*安装Django: pip install Django==1.11.4
*Django创建项目目录: 创建文件夹"Django项目" → 黑屏终端cd到该目录 → 输入命令django-admin startproject 名称
*查看目录层级: tree . /F
manage.py: 一个命令行工具, 可以使我们用多种方式对Django项目进行交互.
project目录: __init__.py: 一个空文件, 它告诉python这个目录应该被看作一个python包.
settings.py: 项目的配置文件.
urls.py: 项目的URL声明.
wsgi.py: 项目与WSGI兼容的web服务器入口.
*创建项目
1.设计表结构
a.班级表结构
表名: grades
字段: 班级名称(gname), 女生总数(ggirlnum), 男生总数(gboynum), 是否删除(isDelete)
b.学生表结构
表名: students
字段: 学生姓名(sname), 学生性别(sgender), 学生年龄(sage), 学生简介(scontent), 所属班级(sgrade), 是否删除(isDelete)
2.配置数据库
注意: Django默认使用SQLite数据库.
如何配置: 在settings.py文件中, 通过DATABASES选项进行数据库配置.
配置MySQL
python3.x安装的是PyMySQL
在__init__文件中写入两行代码, 不写会报错: import pymysql 和 pymysql.install_as_MySQLdb()
格式: DATABASES = {
'default': {
'ENGINE' : 'django.db.backends.mysql'
'NAME' : '数据库名'
'USER' : '用户名'
'PASSWORD' : '数据库密码'
'HOST' : '数据库服务器ip'
'PORT' : '端口',
}
}
3.创建应用
在一个项目中可以创建多个应用, 每个应用进行一种业务处理.
打开黑屏终端进入"Django项目"目录下的project目录.
执行命令 python manage.py startapp myApp.
myApp目录说明
admin.py: 站点配置
model.py: 模型
view: 视图
4.激活应用
在settings.py文件中, 将myApp应用加入到INSATLLED_APPS选项中.
5.定义模型
概述: 有一个数据表, 就对应有一个模型.
在models.py文件中定义模型: class Grades(models.Model)
class Students(models.Model)
说明: 不需要定义主键, 主键会在生成时自动添加, 并且值为自动增加.
6.在数据库中生成数据表
生成迁移文件并执行迁移: 黑屏终端cd到"Django项目"目录下的project目录,
依次执行python manage.py migrate
python manage.py makemigrations myApp
python manage.py sqlmigrate myApp 0001
python manage.py migrate
注意: 如果是要更改某个表的字段之类的, 最好就是直接把数据库的表和迁移文件都干掉重新来, 如果是要新增一个表, 那就直接再生成一份迁移文件就额可以了.
7.测试数据操作
黑屏终端cd到"Django项目"目录下的project目录, 执行命令 python manage.py shell
引入包: from myApp.models import Grades,Students
查询所有数据: 类名.objects.all()
添加数据
本质: 是创建一个模型类的实例对象
添加一个班级
>>>grade1 = Grades()
>>>grade1.gname = "python04"
>>>grade1.ggirlnum = 3
>>>grade1.gboynum = 70
>>>grade1.save() # 保存提交到数据库, 创建或修改数据最后都要.save()提交到数据库.
添加一个学生
>>>stu1 = Students()
>>>stu1.sname = "Alick"
>>>stu1.sgender = True
>>>stu1.sage = 25
>>>stu1.scontent = "我是Alick"
>>>stu1.sgrade = grade1 # 外键关联
>>>stu1.save()
查看具体某一个数据: >>>Grades.objects.get(pk=2) # pk=2是主键为2的意思
修改数据
>>>grade1.gboynum = 60
>>>grade1.save()
删除数据(物理删除, 数据库中的表里的数据被删除了)
>>>grade1.delete()
8.关联对象
获得关联对象的集合: 对象名.关联的类名小写_set.all()
例: grade1.students_set.all() # 获取python04班级所有的学生.
需求: 创建学生"Tom"属于python04班级
==> stu2 = grade1.students_set.create(sname="Tom", sgender=True, scontent="I'm Tom", sage=28) # 这里是直接添加到数据库中了, 不需要save.
9.启动服务器
格式: python manage.py runserver ip:port
注意: ip和port不写就是默认的本机ip和8000端口.
说明: 这是一个纯python写的轻量级的web服务器, 仅仅在开发测试中使用.
10.Admin站点管理
概述: 内容发布(负责添加、修改和删除内容)和公告访问.
配置Asmin应用: 在settings.py的INSTALLED_APPS中添加'django.contrib.admin', 默认是已经添加好的.
创建管理员用户: 执行 python manage.py createsuperuser, 建立用户名密码邮箱.
汉化: 修改settings.py文件, LANGUAGE_CODE = 'zh-Hans', TIME_ZONE = 'Asia/Shanghai'.
管理数据表
修改admin.py文件
from .models import Grades,Students # .models是代表当前目录下的models
# 注册
@admin.register(Grades)
class GradesAdmin(admin.ModelAdmin):
pass
@admin.register(Students)
class StudentsAdmin(admin.ModelAdmin):
pass
自定义管理页面
# 列表页属性
list_display: 显示字段
list_filter: 过滤字段
search_fields: 搜索字段
list_per_page: 分页
# 添加、修改页属性, 不写就是默认的.(fields、fieldsets二者只能用其一)
fields: 可以调整属性的先后顺序
fieldsets: 把属性分组展示
布尔值显示问题
def stu_gender(self):
if self.sgender:
return "男"
else:
return "女"
# 设置页面列的名称
stu_gender.short_description = "性别"
list_display = [stu_gender]
执行动作的位置
# 修改执行动作的位置(顶部或者底部)
actions_on_top = False
actions_on_bottom = True
11.视图的基本使用
概述: 在Django中, 视图对web请求进行回应, 视图就是一个python函数, 在views.py文件中定义.
定义视图
from django.http import HttpResponse
def index(request):
return HttpResponse("alick is a good man")
配置url
修改project.py目录下的urls.py文件(include函数需要导入进来): url(r'^', include("myApp.urls"))
在myApp应用目录下创建一个urls.py文件
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^$', views.index)
]
12.模板的基本使用
概述: 模板是html页面, 可以根据视图中传递过来的数据进行填充.
创建目录模板: 创建templates目录, 在目录下创建对应项目的模板目录(project/templates/myApp)
配置模板路径: 修改settings文件下的TEMPLATES: 'DIRS': [os.path.join(BASE_DIR, "templates")]
创建并定义grades.html和students.html模板
模板语法1: {{ 输出值, 可以是变量, 也可以是对象.属性 }}
模板语法2: {% 执行python代码段 %}
模板语法3: {# 注释 #}
http://127.0.0.1:8000/grades
写grades.html模板
定义视图: def grades(request)
配置url: url(r'^grades/$', views.grades)
http://127.0.0.1:8000/students
写students.html模板
定义视图: def students(request)
配置url: url(r'^students/$', views.students)
注意: 模板路径和url路径是两个不同的东西.
*ORM
概述: 对象关系映射(object-relation-mapping)
任务
根据对象的类型生成表结构
将对象、列表的操作转换为sql语句.
将sql语句查询到的结果转换为对象、列表.
优点: 极大地减轻了开发人员的工作量, 不需要面对因数据库的变更而修改代码.
*模型
模型、属性、表、字段间的关系: 一个模型类在数据库中对应一张表,在模型类中定义的属性,对应该模型对照表中的字段.
定义属性: 各种字段类型
创建模型类
元选项
在模型类里面再定义Meta类, 用于设置元信息
db_table: 定义数据表名, 若不定义数据表名, 则默认会使用"项目名小写_类名小写"来定义表名.
ordering: 对象的默认排序字段
ordering["id"]: 升序
ordering["-id"]: 降序
模型成员
objects: 查询器, 是Manager类的一个对象, 作用是与数据库进行交互, 当定义模型类没有指定查询器, 则Django为模型创建一个名为objects的管理器.
自定义管理器Manager类
模型管理器: 是Django的模型与数据库进行交互的接口.
自定义的作用: 可以向管理器类中添加额外的方法
修改管理器返回的原始查询集, 重写get_queryset()方法.
创建对象
目的: 向数据库中添加数据
本质: 当创建对象时, Django不会对数据库进行读写操作, 当调用save()方法时才与数据库交互, 将对象保存到数据库表中.
注意: __init__方法已经在父类models.Model中使用, 在自定义的模型中无法使用. 没有__init__方法的模型创建的对象是空对象, 所以用这种方式来创建对象不是很方便.
方法
1. 在模型类中增加一个类方法
class Students(models.Model):
@classmethod
def create_student(cls, name, age, gender, contend, grade, isD=False):
stu = cls(sname=name, sage=age, sgender=gender, scontend=contend, sgrade=grade, isDelete=isD)
return stu
2. 在定义管理器中添加一个方法
模型查询
概述: 查询集表示从数据库获取的对象集合, 查询集可以有多个过滤器, 过滤器就是一个函数, 基于所给的参数限制查询集结果, 从sql角度来说, 查询集合select语句等价, 过滤器就像where条件.
查询集
在管理器上调用过滤器方法返回查询集.
查询集经过过滤器筛选后返回新的查询集, 所以可以写成链式调用.
惰性查询: 创建查询集不会带来任何数据的访问, 直到调用数据时才会访问数据.
直接访问数据的情况: 迭代、序列化、与if合用.
返回查询集的方法称为过滤器
all(): 返回查询集中的所有数据
filter(): filter(键=值, 键=值)
exclude(): 过滤掉符合条件的数据
order_by(): 排序
values(): 一条数据就是一个对象(字典), 返回一个列表.
返回单个数据
get(): 返回一个满足条件的对象, 不符合会引发异常.
count(): 返回当前查询集中的对象个数
first(): 返回查询集中的第一个对象
last(): 返回查询集中的最后一个对象.
exists(): 判断查询集中是否有数据, 如果有数据则返回True.
限制查询集
查询集返回列表, 可以使用下标的方式进行限制(下标不能是负数), 等同于sql语句中的limit语句.
studentList = Students.objects.all()[0:5]
字段查询
概述:
概述: 实现了sql语句中的where语句, 作为方法filter()、exclude()、get()的参数.
语法: 属性名称__比较运算符 = 值 , 外键是 属性名_id
转义: like语句中使用%是为了匹配占位, 匹配数据中的%(where like '\%'), filter(sname_contains='%')
比较运算符
exact: 判断, 区分大小写, filter(isDelete=False)
contains: 是否包含, 区分大小写, student_list = Students.object.filter(sname__contains="孙")
startwith、endwith: 以values开头或结尾, 区分大小写, student_list = Students.object.filter(sname__startwith="孙")
以上四个在前面加上i就表示不区分大小写: iexact、icontains、istartwith、iendwith.
isnull/isnotnull: 是否为空, filter(sname__isnull=False)
in: 是否包含在范围内, student_list = Students.object.filter(id__in=[2,4,6,8,10])
gt/gte/lt/lte: 分别对应大于/大于等于/小于/小于等于, student_list = Students.object.filter(sage__gt=30)
year/month/day/week_day/hour/minute/second: student_list = Students.object.filter(lastTime__year=2017)