一.ORM:
在MVC框架中的Model模块中都包括ORM,对于开发人员主要带来了如下好处:
- 实现了数据模型与数据库的解耦,通过简单的配置就可以轻松更换数据库,而不需要修改代码。
- 只需要面向对象编程,不需要面向数据库编写代码。
- 在MVC中Model中定义的类,通过ORM与关系型数据库中的表对应,对象的属性体现对象间的关系,这种关系也被映射到数据表中。
Django框架中ORM示意图如下:
二.案例创建
1.创建一个django文件
- workon py_django
-
django-admin startproject test2
- 然后用Pycharm打开这个文件
-
开始配置编译环境(上个文章已经教过啦)
2.更改数据库
-
找到test2/settings.py 更改数据库
- 修改为MySQL数据库
将引擎改为mysql,提供连接的主机HOST、端口PORT、数据库名NAME、用户名USER、密码PASSWORD。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'test1', #数据库名字,
'USER': 'root', #数据库登录用户名
'PASSWORD': 'root', #数据库登录密码
'HOST': 'localhost', #数据库所在主机
'PORT': '3306', #数据库端口
}
}
- 安装phpsttudy
百度云安装包链接:https://pan.baidu.com/s/1A_wQuzupBdzozSYUN8kRng
提取码:xp8f
直接点击exe文件进行下载安装就可~
- 安装数据库
百度云数据库安装包链接:https://pan.baidu.com/s/1ESkvrfjyfh2YJDcjxndobA
提取码:2rru
(对于这个数据库安装完以后,用一个叫PatchNavicat.exe的东西进行破解,这个插件因为百度云敏感所以上传不了,大家可以百度自行查找) -
然后将这个exe文件复制到数据库的路径下(图片中有那个exe长的模样)
-
双击运行这个exe文件
-
打开数据库,文件/新建连接
-
新建数据库
-
添加数据库
当我们创建完数据库以后,别忘了上方代码还没有链接数据库
3.建立应用
-
首先安装MySQL的环境驱动
查看是否有MySQL的包
-
安装
pip install pymysql
- 打开test2/init.py文件添加两行代码
import pymysql
pymysql.install_as_MySQLdb()
-
创建一个booktest应用
python manage.py startapp booktest
-
将应用注册到项目中(一定要养成良好习惯哈)
test2/setting.py文件种修改
4.定义模型类
1.模型类被定义在"应用/models.py"文件中,此例中为"booktest/models.py"文件。
2.模型类必须继承自Model类,位于包django.db.models中。
3.提示:对于重要数据使用逻辑删除。
- 在booktest/models.py中定义模型类
from django.db import models
# Create your models here.
#定义图书模型类BookInfo
class BookInfo(models.Model):
btitle = models.CharField(max_length=20)#图书名称
bpub_date = models.DateField()#发布日期
bread = models.IntegerField(default=0)#阅读量
bcomment = models.IntegerField(default=0)#评论量
isDelete = models.BooleanField(default=False)#逻辑删除
#定义英雄模型类HeroInfo
class HeroInfo(models.Model):
hname = models.CharField(max_length=20)#英雄姓名
hgender = models.BooleanField(default=True)#英雄性别
isDelete = models.BooleanField(default=False)#逻辑删除
hcomment = models.CharField(max_length=200)#英雄描述信息
hbook = models.ForeignKey('BookInfo')#英雄与图书表的关系为一对多,所以属性定义在英雄模型类中
-
生产迁移文件
python manage.py makemigrations
python manage.py migrate
5.测试数据
- booktest_bookinfo表中插入测试数据:
insert into booktest_bookinfo(btitle,bpub_date,bread,bcomment,isDelete) values
('射雕英雄传','1980-5-1',12,34,0),
('天龙八部','1986-7-24',36,40,0),
('笑傲江湖','1995-12-24',20,80,0),
('雪山飞狐','1987-11-11',58,24,0);
- 向booktest_heroinfo表中插入测试数据:
insert into booktest_heroinfo(hname,hgender,hbook_id,hcomment,isDelete) values
('郭靖',1,1,'降龙十八掌',0),
('黄蓉',0,1,'打狗棍法',0),
('黄药师',1,1,'弹指神通',0),
('欧阳锋',1,1,'蛤蟆功',0),
('梅超风',0,1,'九阴白骨爪',0),
('乔峰',1,2,'降龙十八掌',0),
('段誉',1,2,'六脉神剑',0),
('虚竹',1,2,'天山六阳掌',0),
('王语嫣',0,2,'神仙姐姐',0),
('令狐冲',1,3,'独孤九剑',0),
('任盈盈',0,3,'弹琴',0),
('岳不群',1,3,'华山剑法',0),
('东方不败',0,3,'葵花宝典',0),
('胡斐',1,4,'胡家刀法',0),
('苗若兰',0,4,'黄衣',0),
('程灵素',0,4,'医术',0),
('袁紫衣',0,4,'六合拳',0);
6.定义视图
-
创建模板(上一章有讲具体操作)
-
注册到settings.py中
'DIRS': [os.path.join(BASE_DIR,'templates')],
-
创建index.html文件
- 定义视图代码:
在booktest/views.py文件中编辑:
from django.shortcuts import render
from booktest.models import *
# Create your views here.
#显示图书列表
def index(request):
#查询所有图书的信息
booklist=BookInfo.objects.all()
return render(request, 'booktest/index.html', {'booklist':booklist})
- 配置URL
在test2/urls.py文件中编辑:
from django.conf.urls import include, url
from django.contrib import admin
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
#引入booktest的url配置
url(r'^',include('booktest.urls')),
]
- 将test2/urls.py文件复制到booktest下,并进行修改
from django.conf.urls import include, url
from django.contrib import admin
from booktest import views
urlpatterns=[
url(r'^$',views.index),
]
- 完善index.html代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>图书列表</title>
</head>
<body>
<h1>图书列表</h1>
<ul>
遍历图书列表
{% for book in booklist %}
<li>
<a href="">{{ book.btitle }}</a>
</li>
{% endfor %}
</ul>
</body>
</html>
-
启动程序
python manage.py runserver
-
在浏览器中输入网址:http://127.0.0.1:8000/
-
修改一下index.html中的代码(查看阅读量)
刷新一下就会出现阅读量啦~
7.编写第二个示图功能
-
创建一个detail.html文件
<html>
<head>
<title>详细页</title>
</head>
<body>
{#输出图书标题#}
<h1>{{book.btitle}}</h1>
<ul>
{#通过关系找到本图书的所有英雄,并遍历#}
{%for hero in heros%}
{#输出英雄的姓名及描述#}
<li>{{hero.hname}}---{{hero.hcomment}}</li>
{%endfor%}
</ul>
</body>
</html>
- 修改booktest/views.py文件
#详细页,接收图书的编号,根据编号查询,再通过关系找到本图书的所有英雄并展示
def detail(reqeust, bid):
#根据图书编号对应图书
book = BookInfo.objects.get(id=int(bid))
#查找book图书中的所有英雄信息
heros = book.heroinfo_set.all()
#将图书信息传递到模板中,然后渲染模板
return render(reqeust, 'booktest/detail.html', {'book':book,'heros':heros})
-
打开index.html文件
配置url
打开booktest/urls.py文件
from django.conf.urls import url
#引入视图模块
from booktest import views
urlpatterns = [
#配置首页url
url(r'^$', views.index),
#配置详细页url,\d+表示多个数字,小括号用于取值,建议复习下正则表达式
url(r'^(\d+)/$',views.detail),
]
-
刷新界面
8.增加功能
修改显示形式
- 新增加一个index2.html,里面的代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>图书列表</title>
</head>
<body>
<h1>图书列表</h1>
<a href="">创建一本书</a>
<ul>
{# 遍历图书列表 #}
{% for book in list %}
<li>
{{ book.btitle }}---><a href="/delate">删除</a>
</li>
{% endfor %}
</ul>
</body>
</html>
- 修改view.py文件代码:
def index2(request):
#查询所有图书的信息
list=BookInfo.objects.all()
return render(request, 'booktest/index2.html', {'list':list})
-
配置urls.py
url(r'^list$',views.index2),
- 输入网址:http://127.0.0.1:8000/list
-
修改index2.html代码:
- 修改view.py代码:
from django.shortcuts import render,redirect
from booktest.models import *
from datetime import date
# Create your views here.
#显示图书列表
def index(request):
#查询所有图书的信息
booklist=BookInfo.objects.all()
return render(request, 'booktest/index.html', {'booklist':booklist})
#详细页,接收图书的编号,根据编号查询,再通过关系找到本图书的所有英雄并展示
def detail(reqeust, bid):
#根据图书编号对应图书
book = BookInfo.objects.get(id=int(bid))
#查找book图书中的所有英雄信息
heros = book.heroinfo_set.all()
#将图书信息传递到模板中,然后渲染模板
return render(reqeust, 'booktest/detail.html', {'book':book,'heros':heros})
def index2(request):
#查询所有图书的信息
list=BookInfo.objects.all()
return render(request, 'booktest/index2.html', {'list':list})
#创建新图书
def create(request):
book=BookInfo()
book.btitle = '天涯明月刀'
book.bpub_date = date(1995,12,30)
book.save()
#转向到首页,上面信息被数据库保存
return redirect('/list')
-
配置urls.py
- 刷新页面:http://127.0.0.1:8000/list
9删除功能
-
修改index2.html文件
- 修改views.py文件
#逻辑删除指定编号的图书
def delete(request,id):
book=BookInfo.objects.get(id=int(id))
book.delete()
#转向到list
return redirect('/list')
-
配置urls.py
- 刷新界面:http://127.0.0.1:8000/list
点击删除
(此文章仅作为个人学习笔记使用,如有错误欢迎指正~)