前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Django博客教程(四):让 django 完成翻译—迁移数据库模型

Django博客教程(四):让 django 完成翻译—迁移数据库模型

作者头像
Python中文社区
发布2018-01-31 17:16:30
1.1K0
发布2018-01-31 17:16:30
举报
文章被收录于专栏:Python中文社区Python中文社区

專 欄

追梦人物,Python中文社区专栏作者。电子科技大学计算机学院研究生,从事大数据分析研究方向。主要使用 Python 语言进行相关数据的分析,熟练使用 django 开发网站系统。Django开源论坛作者。

博客地址:

http://www.jianshu.com/u/f0c09f959299

上一篇教程中我们完成了数据库模型的代码,但是那还只是Python 代码而已,我们还没有让django 把它翻译成数据库语言,因此实际上这些数据库表格没有真正地创建。

为了让 django 完成翻译,帮我们创建好这些数据库表,我们再一次请出我的工程管理助手manage.py。进入虚拟环境,切换到manage.py文件所在的目录下,分别运行python manage.py makemigrationspython manage.py migrate命令:

可以看到,当我们执行了 python manage.py makemigrations 后,django 在 blog 应用的 migrations 目录下生成了一个 0001_initial.py 文件,这个文件是 django 用来记录我们对模型做了哪些修改的文件。目前来说,我们在 models.py 文件里创建了 3 个模型类,django 把这些变化记录在了 0001_initial.py 里。但此时只是告诉了 django 我们做了哪些改变,为了让 django 真正地为我们创建数据库表,接下来又执行了 python manage.py migrate 命令。django 通过检测应用中 migrations 目录下的文件,得知我们对数据库做了哪些操作,然后它把这些操作翻译成数据库语言,从而把这些操作应用于真正的数据库里。你可以看到命令的输出除了 Applying blog.0001_initial... OK 外,django 还对其他文件做了操作。这是因为除了我们自己建立的 blog 应用外,django 自身还内置了很多应用,这些应用自己也是需要数据的。可以在 settings.py 的 INSTALLED_APP 设置里看到这些应用:

当然我们目前不必关心这些。

写给了解数据库语言的人:你可以运行下面的命令看看 django 究竟为我们做了什么:

你将看到输出的经 django 翻译后的数据库表创建语句,这有助于你理解 django 的 ORM 的工作机制。 使用 django 的方式从数据库里获取数据

数据库最主要的操作就是往里面存入数据、从中取出数据、修改已保存的数据和删除不再需要的数据。和创建数据库表一样,django 为这些操作提供了一整套方法,从而把我们从数据库中解放出来。我们不用学习如何利用数据库语言去完成这些操作,只要简单地调用几个 python 函数就可以满足我们的需求。

先在命令行中来探索一下这些函数,感受一下如何使用 django 的方式来操作数据库。在 manage.py 所在目录下运行命令:

这打开了一个交互式命令行。

首先我们来创建一个分类和一个标签:

我们首先导入 3 个我们之前写好的模型类,然后实例化了一个 Category 类和一个 Tag 类,为他们的属性 name 赋了值。为了让 django 帮我们把这些数据保存进数据库,调用实例的 save() 方法即可。

再创建一篇文章试试,但创建文章之前,我们需要先创建一个 User,用于指定文章的作者,创建 User 的命令 django 已经帮我们写好了,依然是通过 manage.py 来运行。首先按住 Ctrl + c 退出命令交互栏,运行下面的命令并根据提示创建用户:

运行 python manage.py createsuperuser 开始创建用户,之后会提示你输入用户名、邮箱、密码和确认密码,按照提示输入即可。注意一点的是密码输入过程中不会有任何字符显示,不要误以为你的键盘出问题了。最后出现Superuser created successfully. 说明用户创建成功了。

再次进入 Python 命令交互栏,开始创建文章:

由于我们重启了 shell,因此我们重新导入了 Category, Tag,Post 以及 User,我们还导入了一个 django 提供的辅助模块timezone,这是因为我们需要调用它的 now()方法为created_timemodified_time 指定时间。然后我们根据用户名和分类名,通过 get 方法取出了存在数据库中的 User 和 Category(取数据将在下面介绍)。此外还指定 titlebody的值,并把它和前面创建的category c 关联了起来,只有允许为空 excerpttags 我们就没有为他们指定值了。

数据已经存入数据库了,现在要把它们取出来看看:

objects 是我们的模型管理器,它为我们提供一系列从数据库中取数据方法,这里我们使用了 all() 方法,表示我们要把对应的数据全部取出来。可以看到 all()方法都返回了数据,这些数据应该是我们之前存进去的,但是显示的字符串有点奇怪,让人看不懂。为了让显示出来的数据更加人性化一点,我们分别为三个模型增加一个__str__()方法:

定义好 __str__()方法后,解释器显示的内容将会是由__str__() 方法返回的内容,这里 Category返回分类名nameTag 返回标签名,而 Post 返回它的 title

先按 Ctrl + C退出shell,再重新运行python manage.py shell进入shell

可以看到返回的是我们之前存入的数据。此外我们在创建文章时提到了通过 get方法来获取数据,这里 all 方法和 get 方法的区别是,all 返回全部数据,是一个列表,而 get 返回一条记录数据。

尝试修改数据:

首先通过 get 方法根据分类名 name 获取到分类,修改它的name属性为新的值 category test new,然后调用save 方法把修改保存到数据库,之后可以看到数据库返回的数据已经是修改后的值了。TagPost的修改也一样。

删除掉数据:

先根据标题 title从数据库中取出Post,保存在变量p中,然后调用它的delete 方法,最后看到Post.objects.all()返回了一个空的 QuerySet(类似于一个列表),表明数据库中没有Post,Post已经被删除了。

这就是 django 对数据库增、删、改、查的操作。除了上述演示的方法外,django还为我们提供了大量其它的方法,这些方法有一部分会在教程中使用,用到时我会讲解它们的用法。但以后你开发自己的项目时,你就需要通过阅读 django 的官方文档 来了解有哪些方法已经如何使用它们。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-04-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python中文社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档