让django完成翻译,迁移数据库模型

声明:此Django分类下的教程是追梦人物所有,地址http://www.jianshu.com/u/f0c09f959299,本人写在此只是为了巩固复习使用

 

上篇我们完成了数据库模型的代码,但是还只是python代码而已,我们还没有让django翻译成数据库语言。因此实际上这些table还没有创建

为了让django完成翻译,还需要使用manage.py。进入Terminal运行python manage.py makemigrations 和 python manage.py migrate

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

1 INSTALLED_APPS = [
2     'django.contrib.admin',
3     'django.contrib.auth',
4     'django.contrib.contenttypes',
5     'django.contrib.sessions',
6     'django.contrib.messages',
7     'django.contrib.staticfiles',
8     'blog',
9 ]

你可以运行下面的命令查看django究竟为我们做了什么:python manage.py sqlmigrate blog 0001

 

这些数据库的SQL语言

 

使用django的方式从数据库里获取数据

数据库最主要的操作就是往里面存入数据,从中取出数据,修改已经保存的数据和删除不再需要的

数据,和创建数据库表一样django为这些操作提供了一整套方法,只要简单的调用几个python函数就可以满足我们的需求

在Terminal运行python manage.py shell进入一个交互式命令行

首先创建一个分类和一个标签

1 from blog.models import Category, Post, Tag
2 c = Category(name='category test')
3 c.save()
4 t = Tag(name='tag test')
5 t.save()

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

再创建一篇文章,但创建一篇文章之前,我们需要创建一个User,用于指定文章的作者,创建User的命令django帮我们写好了,依然是通过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='djc')
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,我们还导入了一个timezone,这是因为我们需要调用它的now()方法为created_time和modified_time提供时间,然后我们根据用户名和分类名,通过get方法取出了数据库中的User和Category,此外还指定了title,body的值,并把它和前面创建的Category c关联了起来,只有允许为空excerpt,tags没有指定值

 

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

>>> Category.objects.all()
<QuerySet [<Category: Category object>]>
>>> Tag.objects.all()
<QuerySet [<Tag: Tag object>]>
>>> Post.objects.all()
<QuerySet [<Post: Post object>]>
>>>

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

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

 

>>> from blog.models import Category, Tag, Post
>>> Category.objects.all()
<QuerySet [<Category: category test>]>

>>> Tag.objects.all()
<QuerySet [<Tag: tag test>]>

>>> Post.objects.all()
<QuerySet [<Post: title test>]>

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

 

尝试修改数据:

>>> c = Category.objects.get(name='category test')
>>> c.name = 'category test new'
>>> c.save()
>>> Category.objects.all()
<QuerySet [<Category: test category new>]>

 

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

删除掉数据:

>>> p = Post.objects.get(title='title test')
>>> p
<Post: title test>
>>> p.delete()
(1, {'blog.Post_tags': 0, 'blog.Post': 1})
>>> Post.objects.all()
<QuerySet []>

 

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

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

posted @ 2017-04-19 20:52  LearnerC  阅读(1215)  评论(0编辑  收藏  举报