1.引言
Django模型作为ORM对象关系映射的一种形式,负责将实际的数据库映射为Django应用程序的对象,并提供简单而自然的API,使程序员能够轻松地从数据库中查询、插入、更新和删除数据。
上篇文章中,我们简单介绍了Django的入门知识,本文中我们将以创建一个简单的应用——bbs应用来讲述Python的模型。
2.数据库配置
在开始模型的介绍之前,我们最好先配置好数据库,在第一篇教程生成的django应用中, 找到项目文件夹下的poycode/setting.py文件。首先映入眼帘的就是注释:
Django settings for poycode project.
Generated by 'django-admin startproject' using Django 4.2.4.
这个文件包含了许多配置,包含授权、语言、时区等等,定位到DATABASES配置:
# Database
# https://docs.djangoproject.com/en/4.2/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
可以看到,默认配置的数据库就是python自带的sqlite3数据库,如果只想体验一下Django,无需任何操作就可以使用它。但是,当我们打算借助Django研发一个新的项目时,我们必定会选择扩展性更好,性能更强的数据库。避免中途切换数据库这个令人头疼的问题。
如果想使用其他数据库,则需要安装合适的 database bindings ,然后改变设置文件中 DATABASES
'default'
项目中的一些键值:比如 我们需要增加用户名、密码、端口之类的。
ENGINE可选项包含主流的数据库:
–'django.db.backends.sqlite3'
–'django.db.backends.postgresql'
–'django.db.backends.mysql'
–'django.db.backends.oracle'
除了官方支持的数据库外,还有第三方提供的后端,允许你在 Django 中使用其他数据库,这个需要用的话,可以自行查阅。
接下来我们修改数据库为MySQL,并将配置信息改为:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
"NAME": "poycode_bbs",
"USER": "root",
"PASSWORD": "12345678",
"HOST": "192.168.8.142",
"PORT": "3306",
}
}
2.新建应用
在Django中项目和应用有什么区别?
应用是一个专门做某件事的应用程序——比如积分系统,支付系统,或者日志系统,亦或者一些小型的类似投票、签到之类的程序。
而项目则是一个网站使用的配置和应用的集合。一个项目可以包含很多个应用,应用可以被很多个项目使用。
在上一篇文章中,我们已经学会使用命令:
python manage.py startapp bbs
我们新建一个bbs应用。
3.新建模型
一个模型就是单个定义你的数据的信息源。模型中包含了不可缺少的数据区域和存储数据的行为。Django 遵循 DRY 原则(Do Not Repeat Yourself)。目的就是定义你的数据模型要在同一位置上,而且自动从该位置推导一些事情。
来介绍一下迁移 – 举个例子,不像 Ruby On Rails,Django 的迁移代码是由你的模型文件自动生成的,它本质上是个历史记录,Django 可以用它来进行数据库的滚动更新,通过这种方式使其能够和当前的模型匹配。
例如我们新建一个模型,Post代表文章,UserPost代表用户浏览文章的一些记录
class Post(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
pub_date = models.DateTimeField(auto_now_add=True)
class UserPost(models.Model):
user_id = models.BigIntegerField(name='用户ID')
read_times = models.BigIntegerField(name='个人点击次数', default=1)
is_like = models.BooleanField(name = '喜欢', default=False)
is_start = models.BooleanField(name= '收藏', default=False)
is_public = models.BooleanField(name='公开', default=True)
post = models.ForeignKey(Post, on_delete=models.CASCADE)
上面的代码用于创建模型,但其实这给了 Django 很多信息,Django 可以通过我们编写的模型代码为这个应用创建数据库 schema(生成 CREATE TABLE
语句),并创建可以与 Post
和 UserPost
对象进行交互的 Python 数据库 API。
OK,上述步骤完成之后,我们还需要做什么?要知道,为什么说,应用是一个专门做某件事的应用程序。 Django中应用是可插拔式的,这也是Django的设计哲学之一,你可以在多个项目中使用同一个应用。除此之外,你还可以发布自己的应用,因为它们并不会被绑定到当前安装的 Django 上。
为了使得我们的工程中包含bbs这个应用,我们需要在setting.py配置文件中找到INSTALLED_APPS
,点式路径就是下图中的类。
INSTALLED_APPS = [
'bbs.apps.BbsConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
现在我们项目下已经包含了bbs应用了,接下来运行如下命令
python manage.py makemigrations bbs
通过运行 makemigrations
命令,Django 会检测你对模型文件的修改(在这种情况下,你已经取得了新的),并且把修改的部分储存为一次 迁移。同时会在bbs/migrations文件夹下生成迁移文件。
注意!此时并没有对数据库进行操作!
Django 有一个自动执行数据库迁移并同步管理你的数据库结构的命令 – 这个命令是 migrate
,我们马上就会接触它 – 但是首先,让我们看看迁移命令会执行哪些 SQL 语句。sqlmigrate
命令接收一个迁移的名称,然后返回对应的 SQL:
python manage.py sqlmigrate bbs 0001
- 这个
sqlmigrate
命令并没有真正在你的数据库中的执行迁移 – 相反,它只是把命令输出到屏幕上,让你看看 Django 认为需要执行哪些 SQL 语句。这在你想看看 Django 到底准备做什么,或者当你是数据库管理员,需要写脚本来批量处理数据库时会很有用。
如果你感兴趣,你也可以试试运行 python manage.py check
这个命令帮助你检查项目中的问题,并且在检查过程中不会对数据库进行任何操作。
4. 迁移模型
在Django中我们可以使用如下命令来实施真正的迁移行为,这将对数据库进行变更!
python manage.py migrate
此时打开数据库,可以看到Django为我们生成了数据库表。Django模型的每一次变化都要进行
makemigration, 保存好迁移记录,以便我们在将应用直接移植到其他项目时,可以直接运行 migrate 快速建立并运行项目。这也是python可插拔设计哲学的体现之一。
5. 数据操作
5.1 使用生成的api对数据进行操作
进入交互式 Python 命令行,通过以下命令打开,我们体验一下 Django 创建的各种 API。
python manage.py shell
from bbs.models import Post
>>> from django.utils import timezone
>>> p = Post(title='第一批测试文章', content='文章内容11111测试', pub_date = timezone.now())
>>> p.save()
>>> p.id
1
>>> p.content
'文章内容11111测试'
>>> p.title='更换title'
>>> p.save()
5.2 django自带的后端进行操作
django在创建时,默认为我们安装了一个后台管理应用,可以使用下面的命令来创建一个账户,并按提示输入用户名密码后,即可使用该账户进行访问。
python manage.py createsuperuser
##### 创建完账户后,使用web方式运行django
python manage.py runserver
访问地址:http://127.0.0.1:8000/admin, 并输入上面创建好的账户和密码
进入后,发现Django自带的对用户和组的管理。它们是由 django.contrib.auth 提供的,这是 Django 开发的认证框架。
问题是,我们的bbs应用在哪?我们需要在bbs/admin.py中注册我们的模型,告诉django需要对该模型生成后台接口!
from django.contrib import admin
# Register your models here.
from .models import Post
admin.site.register(Post)
修改完成,刷新页面后,就可以对Post对象进行操作了!
6.总结
本文简单介绍了Django模型,在后面的文章中,我们会继续深入探索Django模型的使用,重点主要体现在查询上。总而言之,通过定义模型,我们可以轻松地管理和操作数据库中的数据。其易用性和扩展性,可以让程序员轻松构建高质量和可扩展的Web应用程序。