> pipenv run python manage.py sqlmigrate blog 0001
你将看到输出了经 django 翻译后的数据库表创建语句,这有助于你理解 django ORM 的工作机制。
选择数据库版本选择数据库版本
我们没有安装任何的数据库软件,django 就帮我们迁移了数据库。这是因为我们使用了 Python 内置的 SQLite3 数据库。
SQLite3 是一个十分轻巧的数据库,它仅有一个文件。你可以看一到项目根目录下多出了一个 db.sqlite3 的文件,这就是 SQLite3 数据库文件,django 博客的数据都会保存在这个数据库文件里。
django 在 settings.py 里为我们做了一些默认的数据库配置:
blogproject/settings.py
## 其它配置选项...
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
## 其它配置选项...
可以看到默认的数据库引擎就是使用的 SQLite3。
当然一些人倾向于使用 MySQL 等大型数据库,至于 django 如何配置 MySQL 这里就不赘述了,你可以自行使用搜索引擎或者查阅 django 的官方文档解决。对于一个小型博客而言,SQLite3 数据库足以胜
任。
用用 django 的方式操作数据库的方式操作数据库
数据库最主要的操作就是往里面存入数据、从中取出数据、修改已保存的数据和删除不再需要的数据(合称 CURD)。和创建数据库表一样,django 为这些操作提供了一整套方法,从而把我们从数据库
语言中解放出来。我们不用学习如何利用数据库语言去完成这些操作,只要简单地调用几个 Python 函数就可以满足我们的需求。
存数据存数据
先在命令行中来探索一下这些函数,感受一下如何用 django 的方式来操作数据库。在 manage.py 所在目录下运行 pipenv run python manage.py shell 命令:
> pipenv run python manage.py shell
Python 3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:54:40) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>
这打开了一个交互式命令行。
首先我们来创建一个分类和一个标签:
>>> from blog.models import Category, Tag, Post
>>> c = Category(name='category test')
>>> c.save()
>>> t = Tag(name='tag test')
>>> t.save()
我们首先导入 3 个之前写好的模型类,然后实例化了一个 Category 类和一个 Tag 类,为他们的属性 name 赋了值。为了让 django 把这些数据保存进数据库,调用实例的 save 方法即可。
再创建一篇文章试试,但创建文章之前,我们需要先创建一个 User,用于指定文章的作者。创建 User 的命令 django 已经帮我们写好了,依然是通过 manage.py 来运行。首先按住 Ctrl + c 退出命令交互栏
(一次退不出就连续多按几次),运行 pipenv run python manage.py createsuperuser 命令并根据提示创建用户:
> pipenv run python manage.py createsuperuser
Username (leave blank to use 'zmrenwu@163.com'): myuser
Email address: a@aa.com
Password:
Password (again):
Superuser created successfully.
运行 python manage.py createsuperuser 开始创建用户,之后会提示你输入用户名、邮箱、密码和确认密码,按照提示输入即可。注意一点的是密码输入过程中不会有任何字符显示,不要误以为你注意一点的是密码输入过程中不会有任何字符显示,不要误以为你
的键盘出问题了,正常输入即可。的键盘出问题了,正常输入即可。 最后出现 Superuser created successfully. 说明用户创建成功了。
再次运行 python manage.py shell 进入 Python 命令交互栏,开始创建文章:
>>> from blog.models import Category, Tag, Post
>>> from django.utils import timezone
>>> from django.contrib.auth.models import User
>>> user = User.objects.get(username='myuser')
>>> c = Category.objects.get(name='category test')
>>> p = Post(title='title test', body='body test', created_time=timezone.now(), modified_time=timezone.now(), category=c, author=user)
>>> p.save()
由于我们重启了 shell,因此需要重新导入了 Category、Tag、Post 以及 User。我们还导入了一个 django 提供的辅助模块 timezone,这是因为我们需要调用它的 now() 方法为 created_time 和
modified_time 指定时间,容易理解 now 方法返回当前时间。然后我们根据用户名和分类名,通过 get 方法取出了存在数据库中的 User 和 Category(取数据的方法将在下面介绍)。接着我们为文章指定
了 title、body 、created_time、modified_time值,并把它和前面创建的 Category 以及 User 关联了起来。允许为空 excerpt、tags 我们就没有为它们指定值了。
注意:注意:
我们这里使用 get 方法根据 Category 的 name 属性的值获取分类的一条记录。Category.objects.get(name='category test') 的含义是从数据库中取出 name 的值为 category test 的分类记录。
确保数据库中只有一条值为 category test 的记录,否则 get 方法将返回一个 MultipleObjectsReturned 异常。如果你不小心已经存了多条记录,请删掉多余的记录。如何删除数据请看下文。
取数据取数据
数据已经存入数据库了,现在要把它们取出来看看:
>>> Category.objects.all()
<QuerySet [<Category: Category object>]>
>>> Tag.objects.all()
<QuerySet [<Tag: Tag object>]>
>>> Post.objects.all()
<QuerySet [<Post: Post object>]>
>>>
objects 是我们的模型管理器,它为我们提供一系列从数据库中取数据方法,这里我们使用了 all 方法,表示我们要把对应的数据全部取出来。可以看到 all 方法都返回了数据,这些数据应该是我们之
前存进去的,但是显示的字符串有点奇怪,无法看出究竟是不是我们之前存入的数据。为了让显示出来的数据更加人性化一点,我们为 3 个模型分别增加一个 __str__ 方法:
blog/models.py
class Category(models.Model):
...
def __str__(self):
return self.name
class Tag(models.Model):
...
def __str__(self):
return self.name
class Post(models.Model):
...