djangoday1

1. DJANGO使用指南



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操作。
图解:


image.png

浏览器中MVC的表现形式图解:

image.png

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去启动,如果不行直接跳到第三步


image.png

2.在cmd中能通过pip3启动安装软件,如果不行直接跳到第三步


image.png

3.配置python环境和pip环境
image.png

4.确认pip安装成功,如果Scritp文件夹下没有pip可执行文件,则执行第五步。

5.由于python3.6安装以后,在Scripts文件中没有pip的可执行软件,需要输入一下命令进行安装

python -m ensurepip
image.png

windows中安装使用

  1. 安装virtualenv
pip install  virtualenv

image
  1. 创建虚拟环境

先查看一下安装虚拟环境有那些参数,是必须填写的

image

注意两个参数:
--no-site-packages和-p参数

virtualenv --no-site-package venv

以下是指定安装虚拟环境中的python版本的安装方式:

image
  1. 进入/退出env
进入 cd env/Scripts/文件夹  在activate命令

退出 deactivate

ubuntu中安装使用

  1. 安装virtualenv
apt-get install python-virtualenv

  1. 创建包含python3版本的虚拟环境
virtualenv -p /usr/bin/python3 env

env代表创建的虚拟环境的名称

  1. 进入/退出env
进入 source env/bin/activate

退出 deactivate

  1. pip使用

    查看虚拟环境下安装的所有的包

    pip list
    
    
  2. 查看虚拟环境重通过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的工程

项目目录介绍

下面展示创建以后的文件,具体有哪些文件:

image

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' 表示英文

image

设置时区: 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)对象关系映射,是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。可以简单理解为翻译机。

image
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))
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • Django 准备 “虚拟环境为什么需要虚拟环境:到目前位置,我们所有的第三方包安装都是直接通过 pip inst...
    33jubi阅读 1,315评论 0 5
  • # Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列...
    小迈克阅读 2,956评论 1 3
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,082评论 1 32
  • 等我有能力了 等我有时间了 等我有钱了 等我准备好了 再开始........... "那时",我是否还有激情? “...
    幸福女人成长阅读 150评论 0 1
  • 很尴尬的一幕出现了。出乎我的意料之外。被辞退了。我觉得比较尴尬。恰逢经济危机之时。又断了收入来源。我现在只能静下心...
    生活记录阅读 182评论 0 1