Model模型
模型是你的数据的唯一的、权威的信息源。它包含你所储存数据的必要字段和行为。
通常,每个模型对应数据库中唯一的一张表。
每个模型都是django.db.models.Model的一个Python 子类。
模型的每个属性都表示为数据库中的一个字段。
Django 提供一套自动生成的用于数据库访问的API;
这极大的减轻了开发人员的工作量,不需要面对因数据库变更而导致的无效劳
模型与数据库的关系
模型(Model)负责业务对象和数据库的关系映射(ORM)
ORM是“对象-关系-映射”的简称,主要任务是:
根据对象的类型生成表结构
将对象、列表的操作,转换为sql语句
将sql查询到的结果转换为对象、列表
为什么要用模型?
Model是MVC框架中重要的一部分,主要负责程序中用于处理数据逻辑的部分。通常模型对象负责在数据库中存取数据
它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库
配置Mysql数据库
1.在当前环境中安装mysql
1sudo apt-get install mysql-server
2sudo apt install mysql-client
3sudo apt install libmysqlclient-dev
2.在当前python环境中安装 pymysql
3.在mysql中创建数据库
1create databases mytest default charset=utf8
4.在Django项目中配置数据库
修改settings.py文件中的DATABASE配置项
1DATABASES = {
2 'default': {
3 'ENGINE': 'django.db.backends.mysql',
4 'NAME': 'mytest',#选择数据库的名,请确认你的mysql中有这个库
5 'USER': 'root',
6 'PASSWORD': '',
7 'HOST': 'localhost',
8 'PORT': '3306',
9 }
10}
5.告诉Django在接下来的mysql操作中使用pymysql
打开
myweb/__init__.py,写入以下代码导入pymysql:
1import pymysql
2pymysql.install_as_MySQLdb()
开发流程
1.在models.py中定义模型类,要求继承自models.Model
1from django.db import models
2from datetime import datetime
3
4# Create your models here.
5class Users(models.Model):
6 name = models.CharField(max_length=32
)
7 age = models.IntegerField(default=20)
8 phone = models.CharField(max_length=16)
9 addtime=models.DateTimeField(default=datetime.now)
10
11 #class Meta:
12 # db_table = "myapp_users" # 指定表名
2.把应用加入settings.py文件的installed_app项
编辑myweb/settings.py文件,并将项目应用文件名添加到该INSTALLED_APPS设置。
1INSTALLED_APPS = [
2 'django.contrib.admin',
3 'django.contrib.auth',
4 'django.contrib.contenttypes',
5 'django.contrib.sessions',
6 'django.contrib.messages',
7 'django.contrib.staticfiles'
,
8 'myapp',
9]
3.生成迁移文件
1python3 manage.py makemigrations
2
3django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module: No mo
4dule named 'MySQLdb'.
5Did you install mysqlclient or MySQL-python?
6安装上面"配置Mysql数据库"的第五步配置,或安装:pip install mysqlclient后就可以了
7
8若执行python manage.py makemigrations命令(也可能人比较皮,把migrations文件夹给删了),会提示"No changes detected." 可能有用的解决方式如下:
9
10 先 python manage.py makemigrations --empty yourappname 生成一个空的initial.py
11 再 python manage.py makemigrations 生成原先的model对应的migration file
4.执行迁移
1python3 manage.py migrate
5.使用模型类进行crud操作(具体详见第二小节)
定义模型
定义属性
导入from django.db import models
通过models.Field创建字段类型的对象,赋值给属性
对于重要数据都做逻辑删除,不做物理删除,实现方法是定义isDelete属性,类型为BooleanField,默认值为False
▌字段类型
AutoField:一个根据实际ID自动增长的IntegerField,通常不指定
BooleanField:true/false 字段,此字段的默认表单控制是CheckboxInput
NullBooleanField:支持null、true、false三种值
CharField(max_length=字符长度):字符串,默认的表单样式是 TextInput
TextField:大文本字段,一般超过4000使用,默认的表单控件是Textarea
IntegerField:整数
DecimalField(max_digits=None, decimal_places=None):使用python的Decimal实例表示的十进制浮点数
FloatField:用Python的float实例来表示的浮点数
DateField[auto_now=False, auto_now_add=False]):使用Python的datetime.date实例表示的日期
参数DateField.auto_now:每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为false
参数DateField.auto_now_add:当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为false
该字段默认对应的表单控件是一个TextInput. 在管理员站点添加了一个JavaScript写的日历控件,和一个“Today"的快捷按钮,包含了一个额外的invalid_date错误消息键
auto_now_add, auto_now, and default 这些设置是相互排斥的,他们之间的任何组合将会发生错误的结果
TimeField:使用Python的datetime.time实例表示的时间,参数同DateField
DateTimeField:使用Python的datetime.datetime实例表示的日期和时间,参数同DateField
FileField:一个上传文件的字段
ImageField:继承了FileField的所有属性和方法,但对上传的对象进行校验,确保它是个有效的image
▌字段选项
通过字段选项,可以实现对字段的约束
在字段对象时通过关键字参数指定
null:如果为True,Django 将空值以NULL 存储到数据库中,默认值是 False
blank:如果为True,则该字段允许为空白,默认值是 False
对比:null是数据库范畴的概念,blank是表单验证证范畴的
db_column:字段的名称,如果未指定,则使用属性的名称
db_index:若值为 True, 则在表中会为此字段创建索引
default:默认值
primary_key:若为 True, 则该字段会成为模型的主键字段
unique:如果为 True, 这个字段在表中必须有唯一值
▌关系
元选项
1class BookInfo(models.Model):
2 ...
3
class Meta():
4 ordering = ['id']
1class BookInfo(models.Model):
2 ...
3 class Meta():
4 ordering = ['-id']
示例演示
1class BookInfo(models.Model):
2 btitle = models.CharField(max_length=20)
3 bpub_date = models.DateTimeField()
4 bread = models.IntegerField(default=0)
5 bcommet = models.IntegerField(default=0)
6 isDelete = models.BooleanField(default=False)
1class HeroInfo(models.Model):
2 hname = models.CharField(max_length=20)
3 hgender = models.BooleanField(default=True)
4 isDelete = models.BooleanField(default=False)
5
hcontent = models.CharField(max_length=100)
6 hbook = models.ForeignKey('BookInfo')
定义index、detail视图
index.html、detail.html模板
配置url,能够完成图书及英雄的展示
测试数据
1insert into booktest_bookinfo(btitle,bpub_date,bread,bcommet,isDelete) values
2('射雕英雄传','1980-5-1',12,34,0),
3('天龙八部','1986-7-24',36,40,0),
4('笑傲江湖','1995-12-24',20,80,0),
5('雪山飞狐','1987-11-11',58,24,0)
1insert into booktest_heroinfo(hname,hgender,hbook_id,hcontent,isDelete) values
2('郭靖',1,1,'降龙十八掌',0),
3('黄蓉',0,1,'打狗棍法',0),
4('黄药师',1,1,'弹指神通',0),
5('欧阳锋',1,1,'蛤蟆功'
,0),
6('梅超风',0,1,'九阴白骨爪',0),
7('乔峰',1,2,'降龙十八掌',0),
8('段誉',1,2,'六脉神剑',0),
9('虚竹',1,2,'天山六阳掌',0),
10('王语嫣',0,2,'神仙姐姐',0),
11('令狐冲',1,3,'独孤九剑',0),
12('任盈盈',0,3,'弹琴',0),
13('岳不群',1,3,'华山剑法',0),
14('东方不败',0,3,'葵花宝典',0),
15('胡斐',1,4,'胡家刀法',0),
16('苗若兰',0,4,'黄衣',0),
17('程灵素',0,4,'医术',0),
18('袁紫衣'
,0,4,'六合拳',0)
模型实例
1.类的属性
1class BookInfo(models.Model):
2 ...
3 books = models.Manager()
2. 创建对象
当创建对象时,django不会对数据库进行读写操作
调用save()方法才与数据库交互,将对象保存到数据库中
使用关键字参数构造模型对象很麻烦,推荐使用下面的两种之式
说明:init方法已经在基类models.Model中使用,在自定义模型中无法使用
3. 实例的属性
4. 实例的方法
模型查询
1. 查询集
1filter(键1=值1,键2=值2)
2等价于
3filter(键1=值1).filter(键2=值2)
限制查询集
1#这会返回前5个对象 LIMIT 5
2Entry.objects.all()[:5]
3#这将返回第六个到第十个对象 OFFSET 5 LIMIT 5
4Entry.objects.all()[5:10]
查询集的缓存
1print([e.title for e in Entry.objects.all()])
2print([e.title for
e in Entry.objects.all()])
1querylist=Entry.objects.all()
2print([e.title for e in querylist])
3print([e.title for e in querylist])
2. 字段查询
比较运算符
1exclude(btitle__contains='传')
1exclude(btitle__endswith='传')
1filter(btitle__isnull=False)
1filter(pk__in=[1
, 2, 3, 4, 5])
1filter(bpub_date__year=1980)
2filter(bpub_date__gt=date(1980, 12, 31))
跨关联关系的查询:处理join查询
1filter(heroinfo_ _hcontent_ _contains='八')
聚合函数
使用aggregate()函数返回聚合函数的值
函数:Avg,Count,Max,Min,Sum
1from django.db.models import Max
2maxDate = list.aggregate(Max('bpub_date'))
Model模型的实战操作笔记
1. 创建数据库和表(若是执行表迁移,可跳过下面操作)
进入MySQL数据库创建数据库:mytest
进入数据库创建数据表:myapp_users
1CREATE TABLE `myapp_users` (
2 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
3 `name` varchar(32) NOT NULL,
4 `age` tinyint(3) unsigned NOT NULL DEFAULT '20',
5 `phone` varchar(16) DEFAULT NULL,
6 `addtime` datetime(6) NOT NULL,
7 PRIMARY KEY (`id`)
8) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
2. 创建项目myweb和应用myapp
1# 创建项目框架myweb
2 $ django-admin startproject myweb
3
4 $ cd myweb
5
6 # 在项目中创建一个myapp应用
7 $ python3.6 manage.py startapp myapp
8
9 # 创建模板目录
10 $ mkdir templates
11 $ mkdir templates/myapp
12
13 $ cd ..
14
15 $ tree myweb
16
17 myweb
18 ├── myweb
19 │ ├── __init__.py
20 │ ├── settings.py
21 │ ├── urls.py
22 │ └── wsgi.py
23 ├── manage.py
24 ├── myapp
25 │ ├── admin.py
26 │ ├── apps.py
27 │ ├── __init__.py
28 │ ├── models.py
29 │ ├── tests.py
30 │ └── views.py
31 └── templates
32 └── myapp
3.执行数据库连接配置,网站配置
3.1 编辑myweb/myweb/__init__.py文件,添加Pymysql的数据库操作支持
1import pymysql
2pymysql.install_as_MySQLdb()
3.2 编辑myweb/myweb/settings.py文件,配置数据库连接
1...
2#配置自己的服务器IP地址
3ALLOWED_HOSTS = ['localhost','127.0.0.1','172.16.142.129'
]
4
5...
6#添加自己应用
7INSTALLED_APPS = [
8 'django.contrib.admin',
9 'django.contrib.auth',
10 'django.contrib.contenttypes',
11 'django.contrib.sessions',
12 'django.contrib.messages',
13 'django.contrib.staticfiles',
14 'myapp',
15]
16...
17
18# 配置模板路径信息
19TEMPLATES = [
20 {
21 'BACKEND': 'django.template.backends.django.DjangoTemplates',
22
'DIRS': [os.path.join(BASE_DIR,'templates')],
23 'APP_DIRS': True,
24 'OPTIONS': {
25 'context_processors': [
26 'django.template.context_processors.debug',
27 'django.template.context_processors.request',
28 'django.contrib.auth.context_processors.auth',
29 'django.contrib.messages.context_processors.messages',
30 ],
31 },
32 },
33]
34
35
36...
37# 数据库连接配置
38DATABASES = {
39'default': {
40
'ENGINE': 'django.db.backends.mysql',
41 'NAME': 'mytest',
42 'USER': 'root',
43 'PASSWORD': '',
44 'HOST': 'localhost',
45 'PORT': '3306',
46}
47...
4. 定义Model类
4.1 编辑myweb/myapp/models.py
1from django.db import models
2
3
4class Users(models.Model):
5 name = models.CharField(max_length=32)
6 age = models.IntegerField(default=20)
7 phone = models.CharField(max_length=16)
8 addtime=models.DateTimeField(default=datetime.now)
9
10 def __str__(self):
11 return self.name+":"+self.phone
4.2 测试Model类的使用
在项目根目录下执行命令: python3 manage.py shell
1[root@localhost myweb]# ls
2myweb manage.py myapp
3
4[root@localhost myweb]# python3 manage.py shell
5Python 3.6.1 (default, Jul 18 2017, 01:35:19)
6[GCC 4.4.7 20120313 (Red Hat 4.4.7-18)] on linux
7Type "help", "copyright", "credits" or "license" for more information.
8(InteractiveConsole)
9
10>>> from myapp.models import Users
11
12>>> Users.objects.all()
1312345678901>, 13456789023>]>
14
15>>> s = Users.objects.get(id=1)
16
17>>> s.id
181
19
20>>> s.name
21'张三'
22
23>>> s.age
2420
25
26>>> s.phone
27'12345678901'
28
29>>>
5.实现 Web 端访问
5.1 编辑myweb/myweb/settings.py文件.做 ALLOWED_HOSTS 主机访问配置(若第三步已做可跳过此步骤)
1 #此处添加自己的IP地址
2 ALLOWED_HOSTS = ['localhost','127.0.0.1','172.16.142.129']
5.2 编写项目主路由urls配置,配置对myapp应用路由的访问连接配置
1from django.conf.urls import include,url
2from django.contrib import admin
3
4urlpatterns = [
5 url(r'^admin/', admin.site.urls),
6 url(r'^', include('myapp.urls')),
7]
5.3 配置当前应用myapp的路由配置
在myapp应用目录下创建一个路由文件urls.py文件,注意此文件编码为utf-8(建议复制一个)。
编辑应用中的路由配置文件:myweb/myapp/urls.py, 内容如下:
1from django.conf.urls import url
2
3from . import views
4
5urlpatterns = [
6 url(r'^$', views.index, name="index"),
7]
5.4 编辑视图文件:myweb/myapp/views.py,内容如下
1#from django.shortcuts import render
2from
django.http import HttpResponse
3
4from myapp.models import Users
5
6def index(request):
7 try:
8 s = Users.objects.get(id=1)
9 return HttpResponse(s)
10 except:
11 return HttpResponse("没有找到对应的信息!")
5.5 测试
项目根目录下运行 python3 manage.py sunserver 0:8000 命令,开启服务:
1[root@localhost myweb]# python3.6 manage.py runserver 0:8000
2
Performing system checks...
3
4System check identified no issues (0 silenced).
5
6July 28, 2017 - 14:01:52
7Django version 1.11, using settings 'myweb.settings'
8Starting development server at http://0:8000/
9Quit the server with CONTROL-C.
打开浏览器,在浏览其中输入网址测试:http://172.16.142.129:8000
显示结果:张三:12345678901
继续上面操作完成Web版的Users信息增 删 改 查
1. 准备模板文件,创建模板目录
在项目目录下创建templates模板目录
进入模板目录templates,在模板目录下创建应用名myapp的目录
进入myapp目录,在里面创建一个users目录
进入users目录,在里面创建文件:
index.html,add.html,edit.html,menu.html,info.html
设置模板目录信息:编辑myweb/myweb/settings.py文件(若第三步已做可跳过此步骤)
1...
2 'BACKEND': 'django.template.backends.django.DjangoTemplates',
3 'DIRS': [os.path.join(BASE_DIR,'templates'),],
4 'APP_DIRS': True,
5...
2. 配置路由信息
打开文件:myweb/myapp/urls.py路由文件,加入六条路由配置信息
1from django.conf.urls import url
2
3
from . import views
4
5urlpatterns = [
6 url(r'^$', views.index, name="index"),
7 url(r'^users$', views.indexUsers, name="users"), #浏览用户信息
8 url(r'^users/add$', views.addUsers, name="addusers"), #加载添加用户信息表单
9 url(r'^users/insert$', views.insertUsers, name="insertusers"), #执行用户信息添加
10 url(r'^users/(?P[0-9]+)/del$', views.delUsers, name="delusers"), #执行用户信息删除
11 url(r'^users/(?P[0-9]+)/edit$', views.editUsers, name="editusers"), #加载用户信息编辑表单
12 url(r'^users/update$', views.updateUsers, name="updateusers"), #执行用户信息编辑
13]
3. 编写视图文件:myweb/myapp/views.py
1# 注意:需导入from django.shortcuts import render
2
3from django.shortcuts import render
4from django.http import HttpResponse
5
6from myapp.models import Users
7
8def index(request):
9 try:
10 list = Users.objects.filter(id__in=[1,3,5])
11 s = ','.join([vo.name for
vo in list])
12
13 #修改(将id值为5的age值改为30)
14 #ob = Users.objects.get(id=5)
15 #ob.age = 30
16 #ob.save()
17
18 #删除(删除id为3的信息)
19 #ob = Users.objects.get(id=3)
20 #ob.delete()
21
22 return HttpResponse(s)
23 except:
24 return HttpResponse("没有找到对应的信息!")
25
26# 浏览用户信息
27def indexUsers
(request):
28 # 执行数据查询,并放置到模板中
29 list = Users.objects.all()
30 context = {"stulist":list}
31 return render(request,"myapp/users/index.html",context)
32
33# 加载添加信息表单
34def addUsers(request):
35 return render(request,"myapp/users/add.html")
36
37# 执行信息添加操作
38def insertUsers(request):
39 try:
40 ob = Users()
41 ob.name = request.POST['name'
]
42 ob.age = request.POST['age']
43 ob.phone = request.POST['phone']
44 ob.save()
45 context = {'info':'添加成功!'}
46 except:
47 context = {'info':'添加失败!'}
48 return render(request,"myapp/users/info.html",context)
49
50# 执行信息删除操作
51def delUsers(request,uid):
52 try:
53 ob = Users.objects.get(id=uid)
54 ob.delete()
55 context = {'info':'删除成功!'}
56
except:
57 context = {'info':'删除失败!'}
58 return render(request,"myapp/users/info.html",context)
59
60# 加载信息编辑表单
61def editUsers(request,uid):
62 try:
63 ob = Users.objects.get(id=uid)
64 context = {'user':ob}
65 return render(request,"myapp/users/edit.html",context)
66 except:
67 context = {'info':'没有找到要修改的信息!'}
68 return render(request,"myapp/users/info.html",context)
69
70
# 执行信息编辑操作
71def updateUsers(request):
72 try:
73 ob = Users.objects.get(id= request.POST['id'])
74 ob.name = request.POST['name']
75 ob.age = request.POST['age']
76 ob.phone = request.POST['phone']
77 #ob.addtime = datetime.now
78 ob.save()
79 context = {'info':'修改成功!'}
80 except:
81 context = {'info':'修改失败!'}
82 return render(request,"myapp/users/info.html",context)
4. 编辑浏览信息视图文件,
文件位置:
myweb/templates/myapp/users/index.html
1html>
2
3
4 "utf-8"/>
5 用户信息管理
6
16
17
18
19
20 {% include 'myapp/users/menu.html' %}
21
22 浏览用户信息
23
46
47
48
5. 编辑添加表单视图文件
文件位置:
myweb/templates/myapp/users/add.html
1html>
2
3
4 "utf-8"/>
5 用户信息管理
6
7
8
9
{% include "myapp/users/menu.html" %}
10
11 添加用户信息
12
35
36
37
6. 编辑信息表单视图文件
文件位置:
myweb/templates/myapp/users/edit.html
1html>
2
3
4 "utf-8"/>
5 用户信息管理
6
7
8
9 {% include "myapp/users/menu.html" %}
10 修改用户信息
11
35
36
37
7. 编辑公共导航栏页视图文件
文件位置:
myweb/templates/myapp/users/menu.html
文件位置:
myweb/templates/myapp/users/info.html
1html>
2
3
4 "utf-8"/>
5 用户信息管理
6
7
8
9
{% include "myapp/users/menu.html" %}
10
11 {{ info }}
12
13
14
15
想要了解更多资讯,请扫描下方二维码,关注机器学习研究会
转自:Python大本营