web应用框架——使用Mysql数据库完成一个MVT设计的图书英雄案例

一.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的包


    并没有PyMySQL的包
  • 安装
    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文件


    index
  • 定义视图代码:
    在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')),
]
配置url
  • 将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),
]
url配置
  • 完善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文件


    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>
detail代码
  • 修改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),
]
定义url
  • 刷新界面


    成功

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')
需要注意的地方

9删除功能

  • 修改index2.html文件


    修改
  • 修改views.py文件
#逻辑删除指定编号的图书
def delete(request,id):
    book=BookInfo.objects.get(id=int(id))
    book.delete()
    #转向到list
    return redirect('/list')
添加代码如下

(此文章仅作为个人学习笔记使用,如有错误欢迎指正~)

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

推荐阅读更多精彩内容