1.Django:即是一个开放源代码的Web应用框架,由Python写成,采用了MVC的框架模式思想,但是有自有的名字MVT,中文文档:https://docs.djangoproject.com/zh-hans/2.0/。
MVC框架如图:
Django模式如下:
ORM模型:Django中嵌了ORM框架,ORM框架可以将类(如图书类)和表(如mysql数据库的图书表)对应起来,只需要通过类操作,就可以操作数据库的表,且会自动生成数据库的表。
2. 安装python第三方包:下载python,cmd->py查看python版本->cd C:\Users\Administrator\AppData\Local\Programs\Python\Python37\Scripts进入srcipts目录->pip install 第三方包名。
注意:C:\Users\Administrator\AppData\Local\Programs\Python\Python37\Scripts是默认安装的Py地址。
3. 虚拟环境:就是真实python环境的复制版本。
4. 安装django,创建django项目:
4.1 安装django: 在C:\Users\Administrator\AppData\Local\Programs\Python\Python37\Scripts命令行下输入pip install django,创建的django项目文件在Lib/site-packages下,可能存在pip版本太低,python环境变量配置。
4.2 创建django项目:在C:\Users\Administrator\AppData\Local\Programs\Python\Python37\Scripts(在Lib/site-packages/django)命令行下输入
django-admin startproject HelloWorld(项目名)
4.3 创建django项目(即HelloWorld(项目名))的一个应用(Django中一个功能模块对应一个应用,如用户模块,商品模块,购物车模块,订单模块):如在HelloWorld文件夹的命令行下输入py manage.py startapp booktest(应用名,如图书模块)。
4.4 创建Django项目(helloworld)与应用(booktest)直接的联系:进行应用注册。在helloworld/helloworld下的settings.py中进行设置。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'booktest', #进行应用(功能模块)的注册。
]
4.5 启动Django项目: 在Django项目(hellowworld)文件命令行下,执行输入py manage.py runserver。然后返回一个浏览器打开的ip地址,默认是浏览器输入127.0.0.1:8000即可。
4.6 创建模型类(如图书信息BookInfo):相当于对应数据库的表名(BookInfo)。
from django.db import models
# Create your models here.
#创建与数据表对应的模型类
#1.创建一个图书类BookInfo,该类必须继承models.Model,才是模型类
class BookInfo(models.Model): #对应数据库的表名(BookInfo)
#1.1 图书名称(btitle)对应数据表(BookInfo)的列名,CharFiled表示列类型为字符串,max_length表示最大长度字符串为20
btitle=models.CharFiled(max_length=20)
#1.2 图书出版日期(bpub_data)对应数据表(BookInfo)的列名,DateFiled表示列类型为日期类型
bpub_data=models.DateFiled()
#1.3 注意:不需要创建表(BookInfo)的id,Django会自动生成
#2.创建一个英雄人物类,该类必须继承models.Model,才是模型类
class HeroInfo(models.Model): #对应数据库的表名(BookInfo)
#2.1 英雄姓名(hname)对应数据表(HeroInfo)的列名,CharFiled表示列类型为字符串,max_length表示最大长度字符串为20
hname=models.CharFiled(max_length=20)
#2.2 英雄性别(hgender)对应数据表(HeroInfo)的列名,BooleanFiled表示列类型为布尔类型,default默认值
hgender=models.BooleanFiled(default="男")
#2.3 英雄备注(hcomment)对应数据表(HeroInfo)的列名,CharFiled表示列类型为字符串,max_length表示最大长度字符串为20
hcomment=models.CharFiled(max_length=20)
#2.4 关系属性(hbook)对应数据表(HeroInfo)的列名,与图书类BookInfo有外键关联(ForeignKey)
hbook=models.ForeignKey("BookInfo")
4.7 将模型类生成表:
第一步生产迁移文件:在Django项目命令行下输入执行py manage.py makemigrations。会放在booktest/migrations文件下自动生成0001_initial.py。
第二步执行迁移生成表:在Django项目命令行下输入执行py manage.py migrate。
4.8 在终端命令行中执行该模型类的增删该查:在Django项目命令行下输入执行py manage.py shell。进入终端操作:
form booktest.models import BookInfo
#1. 实例化一个BookInfo模型类
b=BookInfo()
#2. 修改/获取模型类中列的值
b.btitle="天龙八部"
from datetime import date
b.bpub_date=date(2018.10.28)
#3. 保存修改的执行
b.save()
#4. 实例化一个HeroInfo模型类
h=HeroInfo()
#5. 赋值
h.hname="段誉"
h.hgender="男"
h.hcomment="六脉神剑"
#6. 外键关联BookInfo模型类的实例化
h.hbook=b
#7.保存
h.save()
5. Django后台管理:
5.1 本地化:即在settings.py中修改时间和语言(默认是美国时间和英文):
#LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'zh-hans' #使用中文
#TIME_ZONE = 'UTC'
TIME_ZONE = 'Asia/Shangehai' #没有北京时间,改成亚洲上海时间
5.2 创建管理员:在Django项目命令行下输入执行py manage.py createsuperuser->在命令行输入姓名,邮箱,密码->
然后py manage.py runserver启动服务器->在浏览器输入127.0.0.1:8000/admin/即为Django登录页面。
5.3 在admin.py里创建注册模型类:可以直接显示在浏览器视图中。
5.4 数据库配置:即在settings.py中配置数据库:
DATABASES = {
'default': {
#默认是 sqlite数据库配置
#'ENGINE': 'django.db.backends.sqlite3',
#'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
#将数据库配置成mysql
'ENGINE': 'django.db.backends.mysql', #表示配置的是mysql数据库
'NAME': "books", #要使用的mysql数据名字,手动创建
"USER":"root", #连接mysql的用户名
'PASSWORD':'', #连接mysql的密码
'HOST':'localhost', #数据库所在电脑的ip,本机是localhost
"PORT":3306 #mysql默认3306端口
}
}
注意:切换mysql数据库之后不能启动服务器,如果虚拟环境中没有mysql,需要在python3中pip install pysqml,然后在配置文件helloworld/__init__.py里面配置:
import pymysql
pymysql.install_as_MySQLdb()
6. 配置路由:如127.0.0.1:8000/admin或127.0.0.1:8000/index..............。
6.1 在helloworld/helloworld/urls.py里面配置: 应用(booktest)的路由。
from django.contrib import admin
from django.urls import path,include,url
#项目的urls文件
urlpatterns = [
path('admin/', admin.site.urls), #配置项目,即127.0.0.1:8000/admin显示的视图页面。
url(r'^',include('booktest.urls')), #配置除了127.0.0.1:8000/admin路径之外的其他路径在booktest/urls.py文件里面查找。
]
6.2 在helloworld/booktest/urls.py里面配置: 应用(booktest)里面的视图路由。
from django.urls import url
from booktest import views
#配置views.py里面的index/index2的路径
urlpatterns = [
url(r'^index$',views.index), #配置127.0.0.1:8000/index路径
url(r'^index2$',views.index2), #配置127.0.0.1:8000/index2路径
url(r'^book/(\d+)$',views.details), #(\d)表示路由传数字参时,根据参数不同,显示不同商品的详情,如跳转至book/2页面
]
6.3 在helloworld/booktest/views.py里面配置: 应用(booktest)里面的视图。
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
#1.定义视图函数,HttpResponse
#2.定义url配置,建立url和视图的关系
def index(request): #对应视图127.0.0.1:8000/index
return HttpResponse("这是在浏览器输入127.0.0.1:8000/index时,页面显示的内容")
def index2(request): #对应视图127.0.0.1:8000/index2
return HttpResponse("这是在浏览器输入127.0.0.1:8000/index2时,页面显示的内容")
7. 模板的配置:即应用(booktest)里面的视图返回的具体html内容。
7.1 在项目helloworld下创建模板文件夹templates:即其应用booktest对应的index.html,如templates/booktest/index.html。
这是booktest应用的html模板
新增
这是booktest应用的html模板
使用模板变量:{{content}}
使用列表:{{list}}
使用for循环:
{% for i in list %}
- {{i}}
{% empty%}
- 这里list为空时显示的----- 删除
{% endfor %}
7.2 配置模板:在配置文件helloworld/settings.py下
import os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR,"templates")], #这里是配置模板目录文件,即将项目的绝对路径BASE_DIR和文件夹templates进行拼接
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
7.3 配置模板:在helloworld/booktest/views.py里面配置,应用(booktest)里面的html模板视图,即浏览器输入127.0.0.1:8000/index就会显示的html内容。
from django.shortcuts import render,redirect
from django.http import HttpResponse,HttpResponseRedirect
from django.template import loader,RequestContext
# Create your views here.
#1.定义视图函数,HttpResponse
#2.定义url配置,建立url和视图的关系
def my_render(request,template_path,content_dict):
'''封装使用模板文件函数,和from django.shortcuts import render函数一模一样'''
#1.加载模板文件,模板对象,如index.html
temp=loader.get_template(template_path)
#2.定义模板上下文:给模板文件传递数据,如在index.html里通过{{content}}渲染
context=RequestContext(request,content_dict) #content_dict是字典,如{'content':"这是要传递在模板中content显示的值"}
#3.模板的渲染:产生标准的html内容
res_html=temp.render(context)
#4. 返回给浏览器
return HttpResponse(res_html)
def index(request): #对应视图127.0.0.1:8000/index
# return HttpResponse("这是在浏览器输入127.0.0.1:8000/index时,页面显示的内容")
#return my_render(request,"booktest/index.html",{'content':"hello world"})
return render(request,"booktest/index.html",{'content':"hello world",'list':list(range(1,10))}) #自己封装的my_render和from django.shortcuts import render函数一致一样
def index2(request): #对应视图127.0.0.1:8000/index2
return HttpResponseRedirect("index") #相当于return redirect("/index")
#重定向:服务器不返回页面,而是告诉浏览器再去请求其他url地址 如在"booktest/index.html页面里有的id的参数值bid,从数据库中查找到数据
booke.delete() #删除该数据
return redirect("/index") #重定向
8. 字段属性和选项:
类型 | 描述 |
AutoField | 自增长,默认不指定时,会自动以id自动增长。 |
BooleanField | 布尔 |
NullBooleanField | 布尔和NULL |
CharField(max_length=最大长度) | 字符串的最大长度,max_length必填。 |
TextField | 大文本,一般超过4000个字。 |
IntegerField | 整数 |
DecimalField(max_digits=None, decimal_places=None) |
十进制小数,max_digits总位数,decimal_places小数位数。 |
FloatField | 同上,但是精度差些。 |
DateField([auto_now=False, auto_now_add=False]) |
日期年月日,auto_now是修改时间,auto_now_add创建时间。2者不可同时用。 |
TimeField | 时间时分秒,参数同上。 |
DateTimeField | 日期时间年月日时分秒,参数同上。 |
FileField | 上传文件字段。 |
ImageField | 继承FileField,对上传文件字段校对,确保是有效图片。 |
选项名 | 描述 |
default | 默认值 |
primary_key | 主键,默认false。一般作为AutoField选项使用。 |
unique | 是否唯一,默认false。 |
null | 是否为空,默认值false。 |
blank | 是否有空白,默认值为false。 |
9. 模型类的查询:
函数名 | 功能 | 例如 |
get | 返回表中满足条件的有且只有一条数据 | 查询id=1的数据:BookInfo.objects.get(id=1)。 |
all* | 返回所有数据 | 查询所有数据:BookInfo.objects.all()。 |
exclude* | 返回不满足条件的所有数据 | 查询除了id=1外的所有数据:BookInfo.objects.exclude(id=1)。 |
order_by* | 查询结果的排序 | 查询所有数据按照id排序升序:BookInfo.objects.all().order_by("id"),('-id')表示降序。 |
filter* | 返回满足条件的所有数据 | 查询id=1的数据: BookInfo.objects.filter(id_exact=1)。 查询书名包含“传”的数据: BookInfo.objects.filter(btitle_contains='传')。 查询以传开头(startswith)/结尾(endswith)的数据: BookInfo.objects.filter(btitle_endswith='传')。 查询不为空的数据: BookInfo.objects.filter(btitle_isnull=False)。 查询id=1,3,5的数据:-----范围查询in BookInfo.objects.filter(id_in=[1,3,5])。 查询gt,lt,gte,lte(>,<,>=,<=):-----比较查询 BookInfo.objects.filter(id_gt=5)。 日期查询: BookInfo.objects.filter(bput_data_year=1990),查询1990年出版。 BookInfo.objects.filter(bput_data_lt=data(1990,1,1)),查询1990年1月1日之后出版。 F对象:类属性(数据表中不同列)的比较。 from django.db.models import F BookInfo.objects.filter(bread__gt=F("bcomment")*2),查询阅读量大于2倍评论量的信息。 Q对象:逻辑查询(与(&),或(|),非(~))。 from django.db.models import Q BookInfo.objects.filter(Q(bread__gt=3) | Q(id__gt=5),查询阅读量大于3或id大于5的信息。 BookInfo.objects.filter(~Q(id=3)),查询id不等于3。 聚合函数:Sum,Count,Avg,Max,Min。aggregate返回字典。 from django.db.models import Sum,Count,Avg,Max,Min。 BookInfo.objects.all().aggregate(Sum('bread')),查询阅读量的总数。 count函数:返回一个数字。 BookInfo.objects.filter(id__gt=3).count(),查询Id大于3的数目。 |
注意:带*的函数名返回的是查询集(特性:缓存和惰性查询),可以对其进行切片或下标操作产生新的查询集。如b=BookInfo.objects.all();b[0]或b[0:1].get()为取出查询集的第一个数据,如果第一个数据不存在会抛出异常,可以通过b.exists()返回false/true来判断是否有数据。 |
10. 模型类的关系:即数据库中表与表的关系。
10.1 一对多:如图书类——英雄人物类,models.ForeignKey() 只能定义在英雄人物类中。
10.2 多对多:如新闻类——新闻类型类 体育新闻 国际新闻,models.ManyToManyField() 定义哪个类中都可以。
10.3 一对一:如员工基本信息类——员工信息详情类,models.OneToOneField() 定义哪个类中都可以。
#1. 一对多:图书类——英雄人物类。
class BookInfo(models.Model): #图书类
btitle=models.CharFiled(max_length=20) #图书名
bpub_data=models.DateFiled() #出版日期
class heroInfo(models.Model): #英雄人物类
hname=models.CharFiled(max_length=20) #英雄人名
hbook=models.ForeignKey("BookInfo") #英雄出自哪本书
#2. 多对多:新闻类——新闻类型类。
class NewType(models.Model): #新闻类型类
type_name=models.CharFiled(max_length=20) #新闻类型
type_new=models.ManyToManyField("NewInfo") #关系属性
class NewInfo(models.Model): #新闻类
new_title=models.CharFiled(max_length=20) #新闻标题
#new_type=models.ManyToManyField("NewType") #关系属性,或写上面或写这里
#3. 一对一:员工基本信息类——员工信息详情类。
class EmployInfo(models.Model): #员工基本信息类
employ_name=models.CharFiled(max_length=20) #员工姓名
type_new=models.OneToOneField("EmployDetail") #关系属性
class EmployDetail(models.Model): #员工信息详情类
detail_address=models.CharFiled(max_length=20) #员工地址
#new_type=models.OneToOneField("EmployInfo") #关系属性,或写上面或写这里
11. 关联查询(一对多):
11.1 方法1:
如:查询id为1的图书关联的英雄信息:
b=BookInfo.objects.get(id=1);
b.heroinfo__set.all()
11.2 通过模型类实现关联查询:即最终要查询哪个表的数据,就以哪个表名开始,如查询....图书信息: BookInfo.objects.filter() ,查询......的所有英雄 HerpInfo.objects.filter()。
如:查询图书信息,要求图书关联的英雄描述包含‘八’。
BookInfo.objects.filter(heroinfo__hcomment__contains='八')
如:查询书名为天龙八部的所有英雄。
HerpInfo.objects.filter(hbook__btitle='天龙八部')
2种写法:一类名.objects.filter(小写的多类名__多类名属性__条件)
多类名.objects.filter(关联属性(不是小写一类名)__一类名属性__条件)
12. 查入、更新和删除:
12.1 查入和更新:调用模型类对象的save方法。
12.2 删除:调用模型类对象的delete方法。
13. 自关联: 地区表有一对多,即字关联。
#在model.py中:
class AreaInfo(models.Model):
'''地区模型表'''
#地区名称
atitle=models.CharField(max_length=10)
#关系属性,代表当前地区的父级地区,即自关联
aParent=models.ForeignKey("self",null=True,black=True)
14. 模型管理器objects:如BookInfo.objects.all(),可以自定义一个模型管理器,在改自定义模型管理器中可以修改查询结果和添加额外的方法。
#在model.py中:
class MyManager(models.Manager):
'''自定义一个模型管理器,继承原始的模型管理器models.Manager'''
#作用1:修改查询结果集
def all(self):
#1.1 调用父类的all方法,获取所有数据。如BookInfo.objects.all()。
lists=supper().all() #相当于BookInfo.objects.all()。
#1.2 对所有数据进行筛选。如筛选出id大于3的数据
list=lists.filter(id_gt=3)
#1.3 返回
return list #相当于对原生管理器BookInfo.objects.all()的结果进行筛选。
#作用2:添加其他方法,如对数据库的增删改查操作方法。
def add(self,b1,b2):
#2.1 创建一个模型类的实例对象
book=BookInfo()
book.btitle=b1
book.bpub_data=b2
#2.2 保存修改
book.save()
#2.3 返回
return book
class BookInfo(models.Model): #图书类
btitle=models.CharFiled(max_length=20) #图书名
bpub_data=models.DateFiled() #出版日期
book_objects=MyManager() #实例一个自定义的模型管理器,通过BookInfo.book_objects.all()
#和BookInfo.book_objects.add("三国",'1991-10-23')实现自定义管理器的使用