Django概述

Django概述

Django和Flask属于同一种框架,不过Django属于重量级框架封装了大量的方法,书写时代码更加简洁。Django1.11会支持到2020,首先需要安装Django

pip install django==1.11.7

创建

  1. 使用命令行

创建工程:django-admin startproject ProjectName

创建应用:python manage.py startapp AppName

新创建的app需要在主框架settings.py中的INSTALLED_APPS中注册,在列表中追加‘AppName’即可。

  1. 使用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
  1. manage.py:环境检测和服务启动
  2. AppName:目录就是我们创建的App
    • migrations:自动生成迁移文件
    • app.py:创建app配置
    • models.py:创建数据库模型
    • test.py:写测试程序
    • urls.py:注册路由,从views中导入
    • views.py:定义路由
  3. 主框架
    • __init__.py:传入pymysql模块,伪装成MySQLdb
    • settings.py:注册app、模板、数据库,设置路径等
    • wsgi.py:连通Client和Application
  4. static:静态文件文件夹

如果使用静态文件夹,需要在settings.py里面注册静态文件目录

STATIC_URL = '/static/'
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),
]

如果在pycharm里创建Django项目,会自动生成Templates文件加,用来存放模板文件,不过我们也可以自行创建文件夹标记为模板文件夹

数据库交互

Django是内置ORM模块的框架,也内置了迁移系统,还内置了shell,迁移系统可以和shell结合,用命令行完成更多功能。

迁移系统的使用

Django不需要将书库模型导入到设置里面,执行迁移命令时,会自动创建数据库

  1. 生成迁移文件 python manage.py makemigrations
  2. 执行迁移文件 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方法时,才会对数据库进行操作时。

  1. 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()
  1. 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))
    
  1. update

    基于查询:

    1. 查询对象
    2. 修改属性
    3. 对象.save()
  2. delete

    基于查询:

    1. 查询对象
    2. 查询到的对象
    3. 对象.delete

猜你喜欢

转载自blog.csdn.net/qq_27114273/article/details/92396656
今日推荐