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
文件,都需要用makemigrations
和migrate
这两条指令迁移数据。
在迁移之后,Model的编写就算完成了。
总结
本章初步了解了Django的MTV模式,编写了博客文章的Model模型Book
,并将其迁移到了数据库中。
下一步就向View
进军,学习如何调取模型中的数据。