Django搭建图书管理系统03:编写博客文章的Model模型

news2024/11/28 10:53:12

Django 框架主要关注的是模型(Model)、模板(Template)和视图(Views),称为MTV模式。

它们各自的职责如下:

层次职责
模型(Model),即数据存取层处理与数据相关的所有事务: 如何存取、如何验证有效性、包含哪些行为以及数据之间的关系等。
模板(Template),即业务逻辑层处理与表现相关的决定: 如何在页面或其他类型文档中进行显示。
视图(View),即表现层存取模型及调取恰当模板的相关逻辑。模型与模板的桥梁。

简单来说就是Model存取数据,View决定需要调取哪些数据,而Template则负责将调取出的数据以合理的方式展现出来。

数据库与模型

数据库是存储电子文件的场所,储存独立的数据集合。一个数据库由多个数据表构成。

啥意思?举个栗子,三年级二班中同学们的花名册就是数据表。有的花名册记录每位同学的考试成绩、有的记录身高体重、还有的记录兴趣爱好…所有的这些花名册都放在老师的柜子里,这个柜子就是**“数据库”**了。

默认情况下,数据库就是db.sqlite3这个文件了。

操作数据库使用的是复杂的SQL语句,它是完全不同于Python的另一种语言,这对新手来说无疑是困难的。

幸运的是,在 Django 里写Web应用并不需要你直接去操作数据库,而是定义好模型(用Python语法就可以了!),模型中包含了操作数据库所必要的命令。也就是说你只需要定义数据模型,其它的底层代码都不用关心,它们会自动从模型生成。

其实它有专门的术语,叫对象关系映射Object Relational Mapping,简称ORM),用于实现面向对象编程语言里不同类型系统的数据之间的转换。

编写Model.py

如前面所讲,Django中通过模型(Model)映射到数据库,处理与数据相关的事务。

打开book/models.py文件,输入如下代码:

from django.db import models

# 图书信息数据模型
class Book(models.Model):
    barcode = models.CharField(max_length=20, default='', primary_key=True, verbose_name='图书条形码')
    bookName = models.CharField(max_length=20, default='', verbose_name='图书名称')
    price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='图书价格')
    count = models.IntegerField(default=0, verbose_name='库存')
    publishDate = models.CharField(max_length=20, default='', verbose_name='出版日期')
    publish = models.CharField(max_length=20, default='', verbose_name='出版社')
    bookPhoto = models.ImageField(upload_to='img', max_length='100', verbose_name='图书图片')
    bookDesc = models.TextField(max_length=8000, verbose_name='图书简介')
    bookUpdated = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = 't_Book'
        verbose_name = '图书信息'
        verbose_name_plural = verbose_name

Book类定义了一本书的信息:图书名称、图书价格、出版日期、创建出版社、图书简介等。

我们还可以额外再定义一些内容,规范Book中数据的行为:

# book/models.py

...

class Book(models.Model):
    ...

    # 内部类 class Meta 用于给 model 定义元数据
    class Meta:
        # 数据表名称
        db_table = 't_Book'
        verbose_name = '图书信息'
        verbose_name_plural = verbose_name
        # ordering 指定模型返回的数据的排列顺序
        # '-bookUpdated' 表明数据应该以倒序排列
        ordering = ('-bookUpdated',)

    # 函数 __str__ 定义当调用对象的 str() 方法时的返回值内容
    def __str__(self):
        #  将图书名称返回
        return self.bookName
  • 内部类Meta中的ordering定义了数据的排列方式。-bookUpdated表示将以创建时间的倒序排列,保证了最新的文章总是在网页的最上方。注意ordering是元组,括号中只含一个元素时不要忘记末尾的逗号。
  • __str__方法定义了需要表示数据时应该显示的名称。给模型增加 __str__方法是很重要的,它最常见的就是在Django管理后台中做为对象的显示值。因此应该总是返回一个友好易读的字符串。

恭喜你,你已经完成了博客网站最核心的数据模型的大部分内容。

代码不到20行,是不是完全没啥感觉。后面会慢慢体会Django的强大。

视图、模板马上就会讲到。

数据迁移(Migrations)

编写好了Model后,接下来就需要进行数据迁移。迁移是Django对模型所做的更改传递到数据库中的方式。

Django中MySQL配置

在项目的 settings.py 文件中配置 MySQL 数据库连接。

# settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'your_database_name',
        'USER': 'your_username',
        'PASSWORD': 'your_password',
        'HOST': 'localhost',
        'PORT': '3306',
    }
}

在这里插入图片描述

注意,每当对数据库进行了更改(添加、修改、删除等)操作,都需要进行数据迁移。

Django的迁移代码是由模型文件自动生成的,它本质上只是个历史记录,Django可以用它来进行数据库的滚动更新,通过这种方式使其能够和当前的模型匹配。

在PyCharm的终端,输入python manage.py makemigrations,对模型的更改创建新的迁移表:

(venv) PS E:\djangopj\library> python manage.py makemigrations
Migrations for 'book':
  book\migrations\0001_initial.py
    - Create model Book
(venv) PS E:\djangopj\library> 

通过运行 makemigrations 命令,Django 会检测你对模型文件的修改,并且把修改的部分储存为一次迁移。

然后输入python manage.py migrate应用迁移到数据库中

(venv) PS E:\djangopj\library> python manage.py migrate                                           
Operations to perform:
  Apply all migrations: admin, auth, book, contenttypes, sessions
Running migrations:                                              
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying auth.0012_alter_user_first_name_max_length... OK
  Applying book.0001_initial... OK
  Applying sessions.0001_initial... OK
(venv) PS E:\djangopj\library> 

Navicat查看表格创建成功。
在这里插入图片描述

migrate 命令选中所有还没有执行过的迁移并应用在数据库上,也就是将模型的更改同步到数据库结构上。迁移是非常强大的功能,它能让你在开发过程中持续的改变数据库结构而不需要重新删除和创建表。它专注于使数据库平滑升级而不会丢失数据。

每当你修改了models.py文件,都需要用makemigrationsmigrate这两条指令迁移数据。

在迁移之后,Model的编写就算完成了。

总结

本章初步了解了Django的MTV模式,编写了博客文章的Model模型Book,并将其迁移到了数据库中。

下一步就向View进军,学习如何调取模型中的数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/723844.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【设计模式】第六章:装饰器模式详解及应用案例

系列文章 【设计模式】七大设计原则 【设计模式】第一章:单例模式 【设计模式】第二章:工厂模式 【设计模式】第三章:建造者模式 【设计模式】第四章:原型模式 【设计模式】第五章:适配器模式 【设计模式】第六章&…

STM32外设系列—ESP8266(WIFI)

文章目录 一、ESP8266简介二、固件库烧录三、常用AT指令四、访问API4.1 获取IP地址4.2 GET天气信息4.3 访问结果展示 五、实战项目5.1 串口配置5.2 检测WIFI模块连接状态5.3 发送配置指令5.4 解析天气信息 六、成果展示 一、ESP8266简介 ESP8266是嵌入式和物联网开发中常用的模…

js实现用时间戳生成13位随机数

效果如图: methods里面写方法: changeTime(val) {//去掉-var reg new RegExp("-", "g");var a val.replace(reg, "");//去掉空格var regs new RegExp(" ", "g");var b a.replace(regs, "&qu…

MBD stm32开发 脉冲->GPIO

matlab1028b以上 stm32cubemx5.6.0以上 从正点原子下载,百度的可能存在java问题 stm32-mat/target 教程与代码分享 - 知乎 安装好这些后,打开matlab,打开路径STM32-MAT\STM32 打开MATLAB,在设置路径中添加STM32-MAT/TARGET文件…

港联证券|股指预计维持震荡格局 关注汽车、半导体等板块

6月全行业、全部非金融行业景气继续回落,中报或确认1Q23为本轮全A非金融盈利增速底,但价格支撑偏弱→复苏或缺弹性。结合本轮PPI见底时间、历次去库周期时长以及周期底部的合意库存水平,本轮库存周期大约3Q23见底,Q3市场或进入“补…

关于公安部三所开展网络安全产品认证工作的公告

各网络安全产品厂商&#xff1a; 2023年7月3日&#xff0c;国家互联网信息办公室、工业和信息化部、公安部、国家认证认可监督管理委员会发布了《关于调整<网络关键设备和网络安全专用产品目录>的公告》&#xff08;2023年第2号&#xff09;&#xff0c;调整了网络安全专…

最新kali Linux2023.1镜像下载链接

我们一般推荐使用国内镜像下载 kali linux-2023.1下载地址&#xff1a;国内镜像阿里云开源镜像站下载地址&#xff1a;kali-images-kali-2023.1安装包下载_开源镜像站-阿里云 kali linux-2023.1下载地址&#xff1a;国内镜像网易开源镜像站下载地址&#xff1a;http://mirror…

Spring Boot 中的模板引擎是什么,如何使用

Spring Boot 中的模板引擎是什么&#xff0c;如何使用 在 Web 应用程序中&#xff0c;模板引擎是一种用于动态生成 HTML、XML、JSON 等文档的工具。Spring Boot 内置了多种常见的模板引擎&#xff0c;例如 Thymeleaf、Freemarker、Velocity 等&#xff0c;让我们可以轻松地创建…

赋值CString时导致程序崩溃的一个问题

使用GetWindowTextW将vgj容器内指定结构体的opinion变量赋值 GetDlgItem(IDC_EDIT2)->GetWindowTextW(vgj.at(i).opinion);//将opinion赋值导致程序出现崩溃&#xff0c;通常这种崩溃是由于访问野指针造成的 检查之前的代码有 memset(&vgj.at(i), 0, sizeof(vgj.at(i…

TextFuseNet:具有更丰富融合特征的场景文本检测

计算机视觉 文章目录 计算机视觉摘要1.介绍2.相关工作3.方法3.1框架3.2 多层次特征表示3.3 多路径融合体系结构3.4 弱监督学习 4.实验4.1 数据集4.2 细节4.3消融实验4.4 与最新的形状文本检测方法的比较 5. 结论 论文地址&#xff1a;https://www.ijcai.org/Proceedings/2020/7…

Python教程(2)——开发python常用的IDE

为什么需要IDE 在理解IDE之前&#xff0c;我们先做以下的实验&#xff0c;新建一个文件&#xff0c;输入以下代码 total_sum 0 for x in range(1,101):total_sum x print(total_sum)非常非常简单的一个程序&#xff0c;主要就是计算1加到100的值&#xff0c;我们将它重命名…

阿里云国际站:阿里云究竟是如何胜出的?

标题&#xff1a;阿里云究竟是如何胜出的&#xff1f;   "阿里云究竟是如何胜出的&#xff1f;"这是一个引人入胜的问题&#xff0c;值得我们深挖细究。作为中国市场上引领潮流的云计算服务供应商&#xff0c;阿里云的成功并不是偶发事件&#xff0c;而是其在技术创…

Java语言 - Unicode编码与字符串互转

概述 项目需要Unicode编码与字符串互转&#xff0c;在此做个笔录。 1、code // Press Shift twice to open the Search Everywhere dialog and type show whitespaces, // then press Enter. You can now see whitespace characters in your code. public class Main {public…

一起来看看文档翻译哪个好吧

在繁忙的都市生活中&#xff0c;小玲是一位年轻的职场人士。她的工作经常需要处理各种文档和文件&#xff0c;而其中不乏需要与外国合作伙伴交流的时候。然而&#xff0c;她并不熟悉其他语言&#xff0c;这给她的工作带来了一定的困扰。于是&#xff0c;她开始寻找免费的文档翻…

npm配置淘宝镜像

1.直接配置 npm config set registry https://registry.npmmirror.com/ 2.工具配置 使用nrm配置&#xff0c;镜像地址为&#xff1a;npm registry manager 2.1安装 npm install -g nrm open8.4.2 --save 2.2使用淘宝镜像 nrm use taobao 2.3切换镜像 nrm ls 2.4查看配置项 n…

ssl代理是什么,哪些业务场景可以使用ssl代理?

随着数智化时代的到来&#xff0c;网络安全变得尤为重要。为了保护敏感信息和确保通信的安全性&#xff0c;SSL代理应运而生。SSL代理是一种网络代理服务器&#xff0c;通过解密和重新加密SSL/TLS加密通信&#xff0c;实现对网络通信的监控、分析和保护。今天&#xff0c;我们就…

伦敦金实时走势k线图中的信息

伦敦金实时走势k线图中隐含者很多投资者容易忽略的信息&#xff0c;而且这些信息并不是借助技术指标就能够解读得到得&#xff0c;要通过金价过去和实时走势&#xff0c;去判断未来的走势&#xff0c;投资者需要经历以下的步骤&#xff1a; 首先是要读懂市场的基本结构。很多伦…

Mysql数据库(三) Mysql命令行客户端数据增加、查询、修改、删除;起别名、去重

目录 一、数据增加、查询、修改、删除、起别名、去重 1.0 准备操作 1.1 添加数据 insert 1.1.1 全列添加 1.1.2 部分列插入 1.1.3 插入多行数据 1.2 查询数据 select 1.2.1 查询所有的 列 1.2.2 查询指定的 列 1.3 修改数据 update set 1.4 删除数据 delete 1.5 …

C#(五十三)之线程同步、互锁

无关线程&#xff1a;线程之间没有任何联系&#xff0c;独立运行&#xff0c;互不干扰 相关线程&#xff1a;线程之间有联系&#xff0c;两个线程之间资源共享 临界线程&#xff1a;多个线程共享资源 临界区&#xff1a;访问临界资源代码 同步&#xff1a;两个线程协同工作…

单摆模型(博途PLC和Simulink仿真对比)

单摆模型的详细推导公式可以参看下面文章链接,这篇博客主要给出在博途PLC里如何完成单摆模型的建模, 倒立摆的PLC控制(模型分析+ SCL源代码)_RXXW_Dor的博客-CSDN博客首先简单介绍下倒立摆模型,下面这幅图是MATLAB网站上的倒立摆模型,下面我们利用牛顿第二运动定律建立摆杆…