Django概述
Django和Flask属于同一种框架,不过Django属于重量级框架封装了大量的方法,书写时代码更加简洁。Django1.11会支持到2020,首先需要安装Django
pip install django==1.11.7
创建
- 使用命令行
创建工程:django-admin startproject ProjectName
创建应用:python manage.py startapp AppName
新创建的app需要在主框架settings.py中的INSTALLED_APPS
中注册,在列表中追加‘AppName’
即可。
- 使用pycharm
项目类型选择Django
启动
python manage.py runserver
默认启动在本机的8000端口,如果要实现远程访问,需要在settings.py中设置ALLOW_HOSTS = ["*"]
,然后在启动时添加参数。
可以添加IP和端口,或者单独添加端口,不能只添加IP
python manage.py runserver 0.0.0.0:8000
python manage.py runserver 9000
组成
目录结构树如下所示:
├── App
│ ├── admin.py
│ ├── apps.py
│ ├── __init__.py
│ ├── migrations
│ │ └── __init__.py
│ ├── models.py
│ ├── tests.py
│ └── views.py
├── Django
│ ├── __init__.py
│ ├── __pycache__
│ │ ├── __init__.cpython-36.pyc
│ │ └── settings.cpython-36.pyc
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── manage.py
- manage.py:环境检测和服务启动
- AppName:目录就是我们创建的App
- 主框架
- __init__.py:传入pymysql模块,伪装成MySQLdb
- settings.py:注册app、模板、数据库,设置路径等
- wsgi.py:连通Client和Application
- static:静态文件文件夹
如果使用静态文件夹,需要在settings.py里面注册静态文件目录
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
]
如果在pycharm里创建Django项目,会自动生成Templates文件加,用来存放模板文件,不过我们也可以自行创建文件夹标记为模板文件夹
数据库交互
Django是内置ORM模块的框架,也内置了迁移系统,还内置了shell,迁移系统可以和shell结合,用命令行完成更多功能。
迁移系统的使用
Django不需要将书库模型导入到设置里面,执行迁移命令时,会自动创建数据库
- 生成迁移文件
python manage.py makemigrations
- 执行迁移文件
python manage.py migrate
会在migration文件夹里面生成迁移文件,差量更新,如果需要对数据库做大量的改动,或者删除数据表,需要将迁移文件删除,然后将库中的migration表中的迁移条目删除,再进行迁移。
迁移系统用很多shell命令,用python manage.py --help
来查看命令,一般用在测试和调试中,建完模型后测试数据库的功能,或错误复现。
驱动
Django默认的数据库是sqlite,如果使用sqlite,数据库配置不需要改动,可以自定义数据库名字,如果使用mysql等其他数据库需要,做相应配置,下面是mysql的三个数据库引擎比较
mysqlclient:
对python2,3都支持,但是对mysql的安装有要求,他的驱动需要获取mysql的配置文件mysql.cnf
mysql-python:
只支持python2不支持python3
pymysql:
支持python2,3,pymysql可以伪装成mysqlclient,在主框架下的__init__.py里面添加代码
import pymsql
pymysql.install_as_MySQLdb()
在框架的settings.py中配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'HelloDjango',
'USER': 'root',
'PASSWORD': '000000',
'HOST': 'localhost',
'PORT': '3306'
}
}
ORM
数据库的CRUD,除了创建都是基于查询的。Django创建对象时,不会直接对数据库进行操作,对磁盘的频繁擦写,会降低程序的运行性能,Django会将生成对象的SQL语句保存在缓存中,调用save方法时,才会对数据库进行操作时。
- create
原生Django要在数据模型中封装类方法来创建对象。
@classmethod
def create(cls, name, age):
user = UserModel.objects.create(u_name=name, u_age=age)
return user
然后调用这个方法
user = UserModel(u_name='Tom', u_age=23)
user.save()
- retrieve
Django默认的查询管理器是objects
,查询方法
-
过滤器
- filter 筛选出符合条件的结果
- exclude 筛选出不符合条件的结果
-
get
- 查询条件
# Django中不允许字段名中包含双下划线,他的双下划线被用来标记筛选条件中的运算符 # 在筛选条件中如果需要两个下划线来标记,只是获取字段值需要加引号 user = UserModel.objects.get(u_age__gt=50).order_by("u_id")
- get是双刃剑
- 如果精准匹配到一个元素,可以正常返回
- 如果没有匹配到结果会跑出DoesNotExist错误
- 如果匹配到多个结果,会抛出MutipleObjectsReturned错误
- all
- 返回全部查询结果
- first
- 不需要条件,返回查询集中的第一个元素,即第一数据
- last
- 不需要条件,返回查询集中的最后一个元素,即最后一条数据
- count
- 返回当前查询集中的对象的个数,通常配合其他查询来使用
- exist
- 判断查询集中是否有数据,有返回True,否则返回False
-
限制查询
- 查询限制可以用一个区间来写,前一个数字相当于
offset()
,后一个数字相当于limit()
,下标不能为负数
games = Game.objects.filter(g_price__gt=50).filter(g_price__lt=80) # offset(2) limit(3)----5 - 2 games = games[2, 5]
- 查询限制可以用一个区间来写,前一个数字相当于
-
query属性
- 按照查询的结果,输出SQL语句
games = Game.objects.filter(g_price__gt=50).filter(g_price__lt=80) # 打印转换的SQL语句 print(games.query)
-
比较运算符
- 大小写敏感,在前面加上
i(ignore)
,可以取消大小写敏感 - exact 精准判断,大小写敏感
UserModel.objects.filter(user__u_name__exact='tomm')
- contains 判断是否包含,大小写敏感
filter(sname__contains='赵')
- startwith,endwith 以value开头或结尾,大小写敏感
filter(u_name__startwith='A')
- in 是否包含在范围内
filter(pk__in=[2, 4, 6, 8])
- like 像,形如,可以用正则匹配
filter(u_name__like('vic*'))
以vic开头
- gt, gte, lt, lte 大于,大于等于,小于,小于等于
filter(u_age__gt=30)
- order_by 通过什么排序
- 元素前面加
-
表示逆序 UserModel.objects.get(u_age__gt=50).order_by("u_id")
- 元素前面加
- 大小写敏感,在前面加上
-
时间参数
- year, month, day, week_day, hour, minute, second
books = Book.objects.filter(b_publish_date__year=2020)
-
聚合函数
- Avg 平均值
- Count 统计
- Max 最大
- Min 最小
- Sum 求和
# aggregate为获取的集合,在集合中使用聚合函数,求出最大年龄的用户 UserModel.objects(),aggregate(Max("u_age"))
-
F对象和Q对象
- F对象,对两个属性进行比较,因为过滤条件必须有两个下划线来标记才合法,在查询中如果有两个需要比较的值,不能同时存在两个双下划线,就需要用到F对象,合法化这个属性,同时进行其他算数运算
# 用F对象来比较两个属性的大小 grades = Grade.objects.filter(g_girl_num__gt=F("g_boy_num")) # 获取属性后,通过F对象来对属性来进行算数运算 grades = Grades.object.filter(g_girl_num__gt=F("g_boy_num"+50))
- Q对象,支持与或非的关键参数查询,用来判断过滤条件中的属性
# 与:& 或:| 非:~ # 获取年龄小于25的用户 UserModel.objects.filter(Q(u_age__lt=25)) # 获取年龄不小于25的用户 UserModel.objects.filter(~Q(u_age__lt=25))
-
update
基于查询:
- 查询对象
- 修改属性
- 对象.save()
-
delete
基于查询:
- 查询对象
- 查询到的对象
- 对象.delete