使用Mysql数据库完成一个MVT设计的图书英雄案例
创建项目test4
使用MySQL数据库,这是Web项目首选的数据库。
进入虚拟环境py_django。
workon py_django
在用户目录下/pytest目录下创建项目test4。
django-admin startproject test2
打开test4/settings.py文件,找到DATABASES项,默认使用SQLite3数据库
修改为使用MySQL数据库,代码如下:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'test3', #数据库名字,
'USER': 'root', #数据库登录用户名
'PASSWORD': 'mysql', #数据库登录密码
'HOST': 'localhost', #数据库所在主机
'PORT': '3306', #数据库端口
}
}
创建mysql数据库,使用navicat连接数据库
进入test2目录,创建应用booktest。
python manage.py startapp booktest
再使用mysql数据库时就会出现错误,把数据库切换成了mysql,需要安装pymysql模块之后,Django框架才可以操作mysql数据库。安装命令如下:
pip install pymysql
安装成功之后,在test2/init.py文件中加上如下代码:
import pymysql
pymysql.install_as_MySQLdb()
将应用booktest注册到项目中:打开test2/settings.py文件,找到INSTALLED_APPS项,加入如下代码:
'booktest',
定义模型类
- 模型类被定义在"应用/models.py"文件中,此例中为"booktest/models.py"文件。
- 模型类必须继承自Model类,位于包django.db.models中。
- 提示:对于重要数据使用逻辑删除。
1.打开booktest/models.py文件,定义模型类如下
from django.db import models
定义图书模型类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=False) #英雄性别false是男性
isDelete = models.BooleanField(default=False) #逻辑删除
hcomment = models.CharField(max_length=200) #英雄描述信息
hbook = models.ForeignKey('BookInfo') #英雄与图书表的关系为一对多,所以属性定义在英雄模型类中
2.迁移
生成迁移文件。
python manage.py makemigrations
python manage.py migrate
插入数据
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);
定义视图
打开booktest/views.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,'templates/booktest/index.html',{'booklist':booklist})
def detail(request,bid):
book = BookInfo.objects.get(id=int(bid))
heros = book.heroinfo_set.all()
return render(request,'templates/booktest/detail.html',{'book':book,'heros':heros})
def index2(request):
list = BookInfo.objects.all()
return render(request,'templates/booktest/index2.html',{'list':list})
def create(request):
b=BookInfo()
b.btitle = '神雕侠侣'
b.bpub_date = date(1992,2,6)
b.bcomment = 20
b.bread = 500
b.isDelete = False
b.save()
return redirect('/list')
def delete(request,id):
book = BookInfo.objects.get(id=int(id))
book.delete()
return redirect('/list')
配置url
打开test4/urls.py文件,配置url如下:
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')),
]
在booktest应用下创建urls.py文件,代码如下:
from django.conf.urls import include, url
from django.contrib import admin
from booktest import views
urlpatterns = [
url(r'^$',views.index),
url(r'^detail(\d+)$',views.detail),
url(r'^list$',views.index2),
url(r'^create$',views.create),
url(r'^delete(\d+)$',views.delete),
]
模板代码如下:
运行
python manage.py runserver