引言

在 Django模型设计 中我们只设计了一个BookInfo模型类,内容好单调,接下来我们初步完善一下BMSTes图书管理系统。

模型设计

我们写项目写东西的时候都要养成良好的习惯,不要一来就上手写代码,我们先要进行初步分析和设计,让大脑有整体的概念,需要用到什么技术实现什么效果。这个习惯也不能学的太死,我们要活学活用,学会变通。有时候只是简单的学习一下,或者简单的实现一个小功能。大脑已经可以大概掌握,就无须设计与分析。

初步分析、设计

我们图书管理系统主要实现的是 图书与图书英雄的关联、图书与图书类型的关联管理 ,因此分为图书信息模型、英雄信息模型、图书类型模型,三个模型。对应关系设计如下

一种图书类型,对应多本图书,例如:小说类型的图书,有射雕英雄传、神雕侠侣、倚天屠龙记小说图书等。

一本图书,对应多个英雄,例如:射雕英雄传图书,对应有着郭靖、黄蓉、洪七公等、射雕侠侣则对应杨过、小龙女等。

  • 图书类型模型与图书信息模型关联的是1对多的关系
  • 图书信息模型与英雄信息模型关联的是1对多的关系
实体模型1 实体模型2 对应关系
图书类型(BookType) 图书信息(BookInfo) 1 : N
图书信息(BookInfo) 英雄信息(HeroInfo) 1 : N

具体实现设计

BookType图书类型模型类

类属性 数据类型 备注
id IntegerField(整型) 主键、自增
type_name CharField(字符型) 图书类型

BookInfo图书模型类

类属性 数据类型 备注
id IntegerField(整型) 主键、自增
book_type IntegerField(整型)ForeignKey 图书类型,外键
title CharField(字符型) 图书名称
author CharField(字符型) 图书作者
pub_date CharField(字符型) 图书出版日期
isbn CharField(字符型) 图书ISBN
book_desc CharField(字符型) 图书描述
book_detail TextField(文本类型) 图书详情
book_price DecimalField (数值类型) 图书价格
book_like_num IntegerField(整型) 图书喜欢数
book_collect_num IntegerField(整型) 图书收藏数

HeroInfo图书英雄模型类

类属性 数据类型 备注
id IntegerField(整型) 主键自增
name CharField(字符型) 英雄名称
gender CharField(字符型) 英雄性别
skill CharField(字符型) 英雄技能(武功)
book InterField(整型)Foreignkey 英雄所属图书,外键

Django模型代码

# -*- coding:utf-8 -*-
"""
@Author   :Hui
@Desc     :{模型设计模块}
"""
from django.db import modelsclass BookType(models.Model):"""图书类别类"""type_name = models.CharField(verbose_name=u'图书类型', max_length=20)def __str__(self):return self.type_nameclass Meta:db_table = 'BookType'       # 表名称verbose_name = '图书类型'   # 表备注# 表名复数形式,如果不设置末尾会多一个sverbose_name_plural = verbose_nameordering = ['id']          # 排序字段class BookInfo(models.Model):"""图书模型类"""title = models.CharField(verbose_name=u'图书名称', max_length=20)author = models.CharField(verbose_name=u'图书作者', max_length=20)pub_date = models.DateField(verbose_name=u'出版日期')book_type = models.ForeignKey(BookType, on_delete=models.CASCADE, verbose_name=u'图书类型')isbn = models.CharField(verbose_name='ISBN', max_length=20)book_desc = models.CharField(verbose_name=u'图书描述', max_length=128)book_detail = models.TextField(verbose_name=u'图书详情')book_price = models.DecimalField(verbose_name=u'图书价钱', max_digits=5, decimal_places=2)book_like_num = models.IntegerField(verbose_name=u'图书喜欢量')book_collect_num = models.IntegerField(verbose_name=u'图书收藏量')def __str__(self):return self.titleclass Meta:db_table = 'BookInfo'verbose_name = u'图书信息'verbose_name_plural = verbose_nameordering = ['id']class HeroInfo(models.Model):"""英雄模型类"""name = models.CharField(verbose_name=u'英雄姓名', max_length=20)# 英雄性别gender = models.CharField(verbose_name=u'英雄性别', max_length=3)# 英雄技能(武功)skill = models.CharField(verbose_name=u'英雄武功', max_length=128)# 英雄所属图书book = models.ForeignKey(BookInfo, on_delete=models.CASCADE, verbose_name=u'图书')def __str__(self):return self.nameclass Meta:db_table = 'HeroInfo'verbose_name = u'人物信息'verbose_name_plural = verbose_nameordering = ['id']

设计模型的时候出现了几个之前没用过的字段类型,在这里简单介绍一下。

  • TextField: 大文本字段,一般超过4000个字符时使用。
  • IntegerField: 整数。
  • DecimalField(max_digits=None, decimal_places=None): 十进制浮点数。
    • 参数max_digits表示总位数。
    • 参数decimal_places表示小数位数。

Meta类中的属性

  • db_table: 设置创建数据库表的名称,默认的是 应用名_模型类名
  • verbose_name: 设置数据库表的详细信息(表备注)
  • verbose_name_plural: 设置数据表的复数显示形式
  • ordering: 设置数据表的排序字段

字段、和Meta类中属性,以后再做详细介绍。

自定义后台管理

模型设计好了,接下来就是在 admin.py 下注册模型了,在注册模型中,我新增了 inlineslist_per_pagesearch_fields属性

  • inlines: 用于嵌入编辑关联的对象,属性设置在 一对多 模型(表)关系中的 中。

  • admin.TabularInline: 嵌入编辑关联的对象的编辑样式为表格式类

  • admin.StackedInline: 嵌入编辑关联的对象的编辑样式为堆放式类

  • model: 关联的子对象

  • extra: 嵌入编辑子对象的个数

  • list_per_page: 数据分页,每页的数据个数
  • search_fields: 查询字段
# -*- coding:utf-8 -*-
"""
@Author   :Hui
@Desc     :{后台管理模块}
"""
from django.contrib import admin
from book.models import BookType, BookInfo, HeroInfoclass BookTypeInline(admin.StackedInline):model = BookInfo    # 关联的子对象extra = 1           # 嵌入编辑子对象的个数class BookInfoInline(admin.TabularInline):model = HeroInfoextra = 2class BookTypeAdmin(admin.ModelAdmin):"""图书类型模型管理类"""# 数据分页,每页10条list_per_page = 10# 后台显示的属性(字段)list_display = ['id', 'type_name']# 查询字段search_fields = ['type_name']# 嵌入编辑关联的对象(表格式)inlines = [BookTypeInline]class BookInfoAdmin(admin.ModelAdmin):"""图书信息模型管理类"""list_per_page = 20list_display = ['id', 'title', 'author', 'pub_date', 'book_desc', 'book_like_num', 'book_collect_num', 'book_type']search_fields = ['id', 'title', 'author', 'book_desc']# 设置图书作者、类型为过滤字段list_filter = ['author', 'book_type']# 嵌入编辑关联的对象(堆放式)inlines = [BookInfoInline]class HeroInfoAdmin(admin.ModelAdmin):"""英雄信息模型管理类"""list_display = ['id', 'name', 'skill', 'book']# 设置图书查询字段search_fields = ['name', 'skill', 'book']# 设置英雄图书过滤字段list_filter = ['book']# 注册模型类
admin.site.register(BookType, BookTypeAdmin)
admin.site.register(BookInfo, BookInfoAdmin)
admin.site.register(HeroInfo, HeroInfoAdmin)

配置MySQL数据库

注册完了模型类,接下来就配置数据库,之前用的是 Django 自带的 sqlite3 数据库,现在我们换成 MySQL 数据库。

首先在 PyCharmTerminal 中输入命令安装 pymysql 驱动

pip install pymysql

然后在项目的 settings.py 文件中找到 DATABASES 配置项,将其信息修改为:

DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql',    # MySQL数据库# 'NAME': BASE_DIR / 'db.sqlite3',        # sqlite3数据库'NAME': 'BMSTest',          # 数据库名称'HOST': '127.0.0.1',     # 数据库地址,本机 ip 地址 127.0.0.1'PORT': 3306,               # 数据库端口'USER': 'root',             # 数据库用户名'PASSWORD': '123456',       # 数据库密码}
}

最后在与 settings.py 同级目录下的 __init__.py 中引入模块和进行配置

import pymysqlpymysql.version_info = (1, 4, 13, "final", 0)
pymysql.install_as_MySQLdb()

pymysql.version_info = (1, 4, 13, "final", 0) 这行代码

解决 django.core.exceptions.ImproperlyConfigured: mysqlclient 1.4.0 or newer is required; you have 0.10.1. 这个错 搜索了下网上的解决办法要么升级要么降级 但是都觉得麻烦于是到处找能不能用几行代码解决的方法 最后成功在stackflow上找到一个办法在 settings.py 同级目录下的 __init__.py 插入这行代码就可以了。

运行服务器

  • 创建数据库迁移文件 python manage.py makemigrations
  • 执行数据库迁移文件 python manage.py migrate
  • 运行服务器 python manage.py runserver

如果在运行 python manage.py makemigrations 命令时出现了如下类似的情况

(py_django) D:\Hui\Code\Python\DjangoProject\BMSTest>python manage.py makemigrations
You are trying to add a non-nullable field 'book_type' to bookinfo without a default; we can't do that (the database needs something to populate ex
isting rows).
Please select a fix:1) Provide a one-off default now (will be set on all existing rows with a null value for this column)2) Quit, and let me add a default in models.py
Select an option:

说明表结构与之前的表结构发生了变化,之前 BookInfo 的只有 titleauthorpub_date,现在的则多了 book_typeisbnbook_descbook_detail等属性。且这些属性没有 default 默认值,存在 null 值。

解决方案:

  • 1)选择1,则自己提供 default 值,输入 '' 空字符即可。

  • 2)选择2,在自己新增的属性中设置 default 值、或者允许属性(字段)为空 null,例如:

    book_desc = models.CharField(verbose_name=u'图书描述', max_length=128, null=True)book_detail = models.TextField(verbose_name=u'图书详情', null=True)book_price = models.DecimalField(verbose_name=u'图书价钱', max_digits=5, decimal_places=2, null=True)book_like_num = models.IntegerField(verbose_name=u'图书喜欢量', default=0)book_collect_num = models.IntegerField(verbose_name=u'图书收藏量', default=0)
    

    新增的属性则为默认值 default 、或者空值 null

  • 如果要 切换到其他数据库 时可以在应用下的 migrations 目录下删除之前创建的迁移文件然后在创建迁移文件即可。

数据库结构

注意:如果切换了数据库,数据不会迁移过来,记得自己手动添加或者导入。

图书类型的分页效果图

图书信息的过滤效果图

嵌入编辑关联的对象(堆放式)

在编辑图书类型的时候,会在下面根据 extra 属性值内嵌入关联的对象(图书信息)的个数

嵌入编辑关联的对象(表格式)

建议:

  • 如果关联的模型(表)属性较多,建议使用 堆放式(admin.StackedInline),且不要放置太多,建议1个或者不设置。
  • 如果关联的模型(表)属性较少,放置多些时建议 表格式(admin.TabularInline),少些时任意格式都无伤大雅。

这样就不会导致网页,从上到下滑动的太长、或者是从左到右滑动的太长,而不好编辑,不太美观。

公众号

新建文件夹X

大自然用数百亿年创造出我们现实世界,而程序员用几百年创造出一个完全不同的虚拟世界。我们用键盘敲出一砖一瓦,用大脑构建一切。人们把1000视为权威,我们反其道行之,捍卫1024的地位。我们不是键盘侠,我们只是平凡世界中不凡的缔造者 。

Django教程 —— 初步完善图书管理系统相关推荐

  1. python实现gui+mysql图书管理系统_用Python Django框架写一个图书管理系统LMS

    今天我会带大家真正写一个Django项目,对于入门来说是有点难度的,因为逻辑比较复杂,但是真正的知识就是函数与面向对象,这也是培养用Django思维写项目的开始 Django文件配置 Django模版 ...

  2. Django 第九课 【图书管理系统案例】

    目标网络样式 1:创建项目 #1.1终端配好相关虚拟环境 workon [虚拟环境] #1.2配置相关库文件 pip install [库] #1.3打开pycharm软件,新建Django项目,选择 ...

  3. django实训项目——图书管理系统

    (一)创建Django项目 - books 设置Django项目的位置与名称 (二).创建app应用 1.在终端中执行:python manage.py startapp apps 2.向settin ...

  4. Django增删改查--图书管理系统

    一对一     出版社信息的增删改查 一对多    出版社信息与书籍信息的增删改查 多对多    书籍信息与作者信息的增删改查 建表 from django.db import modelsclass ...

  5. 基于python的图书管理系统测试步骤_Django admin实现图书管理系统菜鸟级教程完整实例...

    Django 有着强大而又及其易用的admin后台,在这里,你可以轻松实现复杂代码实现的功能,如搜索,筛选,分页,题目可编辑,多选框. 简单到,一行代码就可以实现一个功能,而且模块之间耦合得相当完美. ...

  6. 基于Django的图书管理系统开发

    一.系统数据库建立 创建django项目 建立一个项目MyProject,包含app  book; 建立数据库表 在book下的models.py中创建3个数据模型表:book(存储图书信息).pub ...

  7. Django项目开发:图书后台管理系统

    大家好,我是梓栋,今天我给大家分享一个Django入门级开发项目-图书后台管理系统,想要源码资料的小伙伴,请关注微信公众号:,回复 "009"获取! 一.项目介绍 1.管理员登录注 ...

  8. jsp mysql视频_手把手教你做jsp servlet mysql实现的图书管理系统附带视频开发教程和完整源码...

    上一个教程我们做的是对数据库框架底层原理的讲解,然后教大家做了一个自己的数据库框架,这次我们做的这个图书管理系统就是用我们上个教程自己写的数据库框架,整个项目做完框架运行的很稳定,没有出现任何问题.如 ...

  9. 使用django创建一个单表查询的图书管理系统

    使用django创建一个单表查询的图书管理系统 在settings.py文件中添加(用于连接mysql数据库) DATABASES = {'default': {'ENGINE': 'django.d ...

最新文章

  1. 你不知道的javaScript笔记(5)
  2. tomcat 中部署java web项目
  3. 解决通过vue-router打开tab页,下次进入还是上次history缓存的界面状态的问题
  4. electron ipcRenderer渲染进程发送事件, ipcMain主进程监听事件
  5. 【Linux系统编程】Linux系统调用
  6. servlet实现用户登录
  7. Scala程序将多行字符串转换为数组
  8. java编程中的持有对方引用是什么意思?有什么作用?
  9. android-hotfix(QQ空间思路)浅析
  10. Halcon学习(7):颜色识别
  11. c语言更正错误,c语言出错invalid operands to binary %
  12. allure-report详细使用教程
  13. 浅谈python运算符运算法则
  14. TencentOS浅学过程记录
  15. oracle用户删除了可以恢复吗,oracle_oracle误删数据恢复方法小结,如果用户误删/更新了数据后, - phpStudy...
  16. 男女之间没有真正的友谊
  17. C++ 鼠标模拟程序
  18. WMCMS小说系统采集插件-WMCMS小说系统采集器下载
  19. 如何使用JavaScript导入和导出Excel文件
  20. 大数据平台架构技术选型与场景运用

热门文章

  1. php输出setcookie,PHP函数:setcookie()
  2. 位运算——左移右移运算详解
  3. 美国大学生足球联赛数据集football——node2vec
  4. mybatis(错误二) 项目启动时报“Result Maps collection already contains value forxxx”的解决方案
  5. 高版本CAD如何降低版本?来看这种降低版本方法
  6. 电子设计常识——阻抗
  7. vue中关键字的搜索,输入关键字列表和分页一起刷新
  8. 如何将md文件转换为html
  9. 第二阶段--团队冲刺--第九天
  10. 0 前言 关于数学基础以及如何入门算法学习