一、Django基础
Django 是用Python开发的一个免费开源的Web框架,可以用于快速搭建高性能,优雅的网站!
Django的特点:
强大的数据库功能:拥有强大的数据库操作接口(QuerySet API),也能执行原生SQL
自带强大后台:网站拥有一个强大的后台,轻松管理内容
优雅的网址:用正则匹配网址,传递到对应函数,随意定义。
模版系统:易扩展的模版系统,设计简易,代码,样式 分开设计,更容易管理。
缓存系统:与memcached,redis等缓存系统联用,更出色的表现,更快的加载速度。
国际化:完全支持多国语言应用,允许定义翻译的字符,轻松翻译成不同国际的语言。
Django目录结构:
urls.py:网址入口,关联到对应的Views.py中的一个函数,访问网址对应的函数。
views.py:处理用户发出的请求,从urls.py中对应过来,通过渲染templates中的网页可以将显示内容,比如登陆后的用户名,数据,输出到网页。
models.py:与数据库操作相关,存入或读取数据时用到这个
templates文件夹:views.py中的函数渲染templates中的HTML模版,得到动态内容网页,可以用缓存来提高速度。
admin.py:后台,可以用很少量的代码就拥有一个强大的后台。
settings.py:Django的全局设置,配置文件,比如DEBUG的开关,静态文件的位置设置等。
二、Django安装
1、用pip来安装
(1)安装pip:yum install python-pip 或者https://bootstrap.pypa.io/get-pip.py 下载get-pip然后运行python get-pip.py就可以安装pip了;也可以下载pip源码包,运行python setup.py install 进行安装。
(2)利用pip安装Django
pip install Django 或者 pip install Django==2.0.4
升级pip可以用:pip install --upgrade pip
2、下载源码安装
linux and MAC:
下载源码包:https://www.djangoproject.com/m/releases/2.0/Django-2.0.4.tar.gz
tar -xvf django-2.0.4.tar.gz
cd django-2.0.4
python setup.py install
3、linux用自带源进行安装
ubuntu:
sudo apt-get install python-django -y
fedora:
yum install python-django -y
检查是否安装成功:看到版本号则安装成功!
>> import django
>> django.VERSION
(2, 0, 4, 'final', 0)
>> django.get_version()
'2.0.4'
三、Django基本命令
1.创建一个django项目
直接在终端输入:
django-admin startproject Hello
然后进入mysite这个文件目录,在终端输入:
cd Hello/
查看目录有什么内容,在终端输入: ls
然后我们继续进入mysite这个目录在通过ls查看有什么内容。
看一下它的结构
Hello/
├── manage.py
└── Hello
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py
Hello/ 根目录只是项目的容器,它的名字与Django无关,可以将它重命名为任何任何名字
manage.py:一个命令行实用程序,可让你以各种方式与Django项目进行交互
Hello:是项目的实际python包,它的名字是你需要用来导入任何内容的python包名
init.py:一个空文件,告诉python这个目录应该被视为一个python包
settings.py:这是Django项目的设置与配置,Django设置会告诉你有关设置如何工作的所有信息
urls.py:这是Django项目的URL声明
wsqi.py:WSGI兼容的Web服务器为你的项目提供服务的入口点
四、启动服务器
通过上面的操作我们已经创建好一个django项目了,我们回到最外层的mysite/这个目录,然后在终端输入:python manage.py runserver 启动服务器,成功后会出现下面的样子。
然后我们在浏览器访问http://127.0.0.1:8000/,会出现下面这个样子。
到现在为止我们已经成功新建了一个新的django项目,并且把它运行了起来。
创建一个应用
值得一提的是项目和应用的区别:一个应用是 Web 程序中的一个功能,比如博客应用,投票应用.一个项目是许多个基本应用的集合
直接在终端输入命令: python manage.py startapp staffadmin
成功创建staffadmin这个应用我们可以进入这个文件目录看下都有哪些文件。
admin.py:这个是配置管理后台数据.
models.py :这里面的每一个类,可以比喻成数据库的每一个表.
views.py :主要用作前后端交互。
urls.py:用作配置路由。
创建一个视图
打开staffadmin/views.py这个文件,写下如下代码
然后我们在staffadmin目录下新建一个urls.py,写下如下代码
同时还要配置一下Hello/urls.py,写下如下代码
然后我们通过浏览器访问http://127.0.0.1:8000/staffadmin/index
如果成功访问,会在浏览器看到"This is my first application"。
我们也可以在子文件夹Hello/下创建一个视图view.py
然后在Hello/下的urls.py里添加
然后访问127.0.0.1:8080,就可以看到hello world!了
也可以修改以下规则
然后访问127.0.0.1/hello,效果一样
五、配置数据库
我们打开Hello/Hello/settings.py这个文件。
我们可以看到熟悉的databases,默认配置的数据库是 SQLite,如果你想使用其它的数据库,需要在文件中的 DATABASES 'default' 改变适当的值。
比如我们想要连接mysql:
我们还可以通过这样修改时区和中文设置。
我们还可以看到INSTALLED_APPS有这些应用
在django中一些应用程序使用至少一个数据库表,因此我们需要在数据库中创建表,然后才能使用它们。
直接在终端输入命令:python manage.py migrate
创建模型
上面两个类相当于创建了两个表,类名代表表名,变量代表列名
激活模型
可以在INSTALLED_APPS里面加上'staffadmin'或者'staffadmin.apps.staffadminConfig'
经过上面的操作我们已经注册staffadmin这个应用了,因为我们之前对模型做了一些改变,并且你想要把这些改变保存为 migration。
直接在终端输入命令:python manage.py makemigrations staffadmin
如果我们想知道这个命令到底做了些什么,可以通过在终端直接输入命令: python manage.py sqlmigrate staffadmin 0001
熟悉数据库的同学一看就明白,这不就是创建数据库表的操作命令吗?没错的确如此。
然后我们还差最后一步就可以把数据库创建起来,
直接在终端输入命令: python manage.py migrate staffadmin
直到这一步,我们的数据库已经建好。现在我还要提醒的是,migrate 命令会执行所有还没应用的迁移,
并会在数据库中执行相应的代码来同步你的修改.迁移是一个非常强大且有用的工具,可以让你在开发项目的任何时候,
不需要对数据库进行删除增加等操作就完成修改,在升级数据库信息时也不会造成丢失.现在只需要记住以下这三个步骤:
如果修改了模型(在 models.py 文件中).
运行 python manage.py makemigrations来为这些修改创建迁移.
运行 python manage.py migrate 来应用这些改变到数据库.
操作数据库(models)
操作数据库无非就是增删改查。
首先我们在终端输入命令python manage.py shell
,然后先把我们的数据库表引进来。
from staff.modles import Department
增
models.Department.objects.create(department_name='市场部') 增加一条数据,可以接受字典类型数据 **kwargs
obj = models.Department(department_name='市场部')
obj.save()
查
models.Department.objects.get(id=1) # 获取id=1的单条数据,不存在则报错(不建议)
models.Department.objects.all() # 获取全部数据
models.Department.objects.filter(department_name='市场部') # 获取department_name='市场部'的数据# models.Department.objects.exclude(department_name='市场部') # 获取除了department_name='市场部'的数据
删
models.Department.objects.filter(department_name='市场部').delete() # 删除department_name='市场部'的数据
改
models.Department.objects.filter(department_name='市场部').update(department_name='运营部') # 将department_name="市场部"改成"运营部",均支持 **kwargs
obj = models.Department.objects.get(id=1)
obj.department_name= '运营部'
obj.save() # 保存数据
当有一对多,多对一,或者多对多的关系的时候,先把相关的对象查询出来
在这里我提一下ForeignKey,ManyToManyField与OneToOneField分别是Model中定义多对一,多对多,一对一关系。
在本例的教程中,我们可以知道一个员工只有一个部门,一个部门可以有多个员工,所以用了ForeignKeyField
admin站点的使用
首先我们先创建一个超级用户的账号
直接在终端输入命令:python manage.py createsupperuser
,然后根据提示输入相关内容即可。
此时我们可以通过浏览器访问http://127.0.0.1:8000/admin/,我们会看到下面的画面。
此时我们发现我们写的models没有显示出来,是因为没有在admin上面注册。
所以我们打开Hello/staffadmin/admin.py这个文件
然后我们把models引进来
保存代码,然后刷新浏览器我们发现多了一个staffadmin的管理组
然后看看其内容
这是我们刚才添加的信息
使用mysql数据库
与数据库的交互:
把数据存取逻辑、业务逻辑和表现逻辑组合在一起的概念有时被称为软件架构的 Model-View-Controller (MVC)模式。在这个模式中, Model 代表数据存取层,View 代表的是系统中选择显示什么和怎么显示的部分,Controller 指的是系统中根据用户输入并视需要访问模型,以决定使用哪个视图的那部分。
由于 C 由框架自行处理,而 Django 里更关注的是模型(Model)、模板(Template)和视图(Views),Django 也被称为 MTV 框架 。在 MTV 开发模式中:
M 代表模型(Model),即数据存取层。该层处理与数据相关的所有事务:如何存取、如何确认有效性、包含哪些行为以及数据之间的关系等。
T 代表模板(Template),即表现层。该层处理与表现相关的决定:如何在页面或其他类型文档中进行显示。
V代表View,业务逻辑层。这一层包含访问模型的逻辑和按照模板显示。你可以认为它是模型和模板的桥梁。
上面的数据库用的是django自带的sqlite3,我们也可以使用更方便地mysql,首先配置文件中修改一下mysql配置,上面提到过
这里详细说一下mysql的方法,因为上面创建了一个staffadmin的app应用,这里我们新建一个应用----people
然后修改mysql配置,在我们的项目HELLO/Hello/setting.py中
修改对应的mysql数据库、用户、密码、端口
然后将我们新建的应用(people)添加到 settings.py 中的 INSTALLED_APPS中,也就是告诉Django有这么一个应用。
然后修改models.py
我们打开 people/models.py 文件,修改其中的代码如下:
from django.db import models
# Create your models here.
class Person(models.Model):
name = models.CharField(max_length=30)
age = models.IntegerField()
def __str__(self):
return self.name
我们新建了一个Person类,继承自models.Model, 一个人有姓名和年龄。
也就相当于在mysql中创建了一个person表,然后里面的字段属性有年龄,名字等
在Django中使用该数据库布局的第一步是将其表述为Python代码。在通过“startapp”命令创建的“models.py”文件中
例如:
from django.db import models
class Publisher(models.Model):
name = models.CharField(max_length=30)
address = models.CharField(max_length=50)
city = models.CharField(max_length=60)
state_province = models.CharField(max_length=30)
country = models.CharField(max_length=50)
website = models.URLField()
这段python代码创建了一个Publisher类,也就等同于在数据库中
CREATE TABLE "books_publisher" (
"id" serial NOT NULL PRIMARY KEY,
"name" varchar(30) NOT NULL,
"address" varchar(50) NOT NULL,
"city" varchar(60) NOT NULL,
"state_province" varchar(30) NOT NULL,
"country" varchar(50) NOT NULL,
"website" varchar(200) NOT NULL
);
每个模型相当于单个数据库表,每个属性也是这个表中的一个字段。 属性名就是字段名,它的类型(例如 CharField )相当于数据库的字段类型 (例如 varchar )。
然后shell创建数据表,同步数据库信息
输入一下命令
# Django 1.6.x 及以下
python manage.py syncdb
# Django 1.7 及以上的版本需要用以下命令
python manage.py makemigrations
python manage.py migrate
先 python manage.py makemigrations [appname]
再 python manage.py migrate [appname]
初始化数据库,如此,我们就可以在django项目中使用mysql数据库了。
然后可以看到数据库里对应了相应的表
如何使用这个表呢?方法和上面一样
使用 Django 提供的 QuerySet API
Django提供了丰富的API, 下面演示如何使用它。
我们新建了一个用户WeizhongTu,它返回了一个类,名字为我们创建的, 那么如何从数据库是查询到它呢?
我们用了一个 .objects.get() 方法查询出来符合条件的对象,但是大家注意到了没有,我的models.py中多写了def....最后两行
from django.db import models
class Person(models.Model):
name = models.CharField(max_length=30)
age = models.IntegerField()
def __unicode__(self):
# 在Python3中使用 def __str__(self):
return self.name
如果我们不添加的话它将返回<Person: Person object>
>>> Person.objects.get(name="WeizhongTu")
<Person: Person object>
>>>
这里并没有显示出与WeizhongTu的相关信息,如果用户多了就无法知道查询出来的到底是谁,查询结果是否正确,所以我们修改一下 people/models.py,添加最后两行内容
注意:name 和 age 等字段中不能有 __(双下划线,因为在Django QuerySet API中有特殊含义(用于关系,包含,不区分大小写,以什么开头或结尾,日期的大于小于,正则等)
也不能有Python中的关键字,name 是合法的,student_name 也合法,但是student__name不合法,try, class, continue 也不合法,因为它是Python的关键字( import keyword; print(keyword.kwlist) 可以打出所有的关键字)
新建一个对象的方法有以下几种:
Person.objects.create(name=name,age=age)
p = Person(name="WZ", age=23)
p.save()
p = Person(name="TWZ")
p.age = 23
p.save()
Person.objects.get_or_create(name="WZT", age=23)
这种方法是防止重复很好的方法,但是速度要相对慢些,返回一个元组,第一个为Person对象,第二个为True或False, 新建时返回的是True, 已经存在时返回False.
获取对象有以下方法:
Person.objects.all()
Person.objects.all()[:10] 切片操作,获取10个人,不支持负索引,切片可以节约内存
Person.objects.get(name=name)
get是用来获取一个对象的,如果需要获取满足条件的一些人,就要用到filter
Person.objects.filter(name="abc") # 等于Person.objects.filter(name__exact="abc") 名称严格等于 "abc" 的人
Person.objects.filter(name__iexact="abc") # 名称为 abc 但是不区分大小写,可以找到 ABC, Abc, aBC,这些都符合条件
Person.objects.filter(name__contains="abc") # 名称中包含 "abc"的人
Person.objects.filter(name__icontains="abc") #名称中包含 "abc",且abc不区分大小写
Person.objects.filter(name__regex="^abc") # 正则表达式查询
Person.objects.filter(name__iregex="^abc") # 正则表达式不区分大小写
filter是找出满足条件的,当然也有排除符合某条件的
Person.objects.exclude(name__contains="WZ") # 排除包含 WZ 的Person对象
Person.objects.filter(name__contains="abc").exclude(age=23) # 找出名称含有abc, 但是排除年龄是23
然后注册我们的models在admin上,效果和上面是一样的