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代码



    
    图书列表


图书列表

  • 启动程序
    python manage.py runserver


    运行成功
  • 在浏览器中输入网址:http://127.0.0.1:8000/


    出现图书列表
  • 修改一下index.html中的代码(查看阅读量)


    修改代码

    刷新一下就会出现阅读量啦~


    显示阅读量

7.编写第二个示图功能

  • 创建一个detail.html文件


    detail.html


    详细页


{#输出图书标题#}

{{book.btitle}}

    {#通过关系找到本图书的所有英雄,并遍历#} {%for hero in heros%} {#输出英雄的姓名及描述#}
  • {{hero.hname}}---{{hero.hcomment}}
  • {%endfor%}
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,里面的代码如下:



    
    图书列表


图书列表

创建一本书
    {# 遍历图书列表 #} {% for book in list %}
  • {{ book.btitle }}--->删除
  • {% endfor %}
代码
  • 修改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


    配置url
  • 刷新页面: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
    界面

    点击删除
    删除完成

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

你可能感兴趣的:(web应用框架——使用Mysql数据库完成一个MVT设计的图书英雄案例)