设为首页 加入收藏

TOP

Django1.8教程——从零开始搭建一个完整django博客(三)(一)
2017-09-30 17:10:49 】 浏览:5928
Tags:Django1.8 教程 从零 开始 搭建 一个 完整 django 博客

这一节主要介绍对数据库的访问操作:通过管理器(manage),对对象进行检索、修改、删除等操作,详细介绍了如何针对不同的模型自定义管理器。

查询和管理工作

现在,我们已经有了一个功能完善的Django管理站点来管理我们的应用,是时候学习一下如何从数据库中检索我们所需要的数据。Django自带一个功能强大的抽象数据库API,使我们能轻松的创建、检索、修改、和删除对象。Django的对象关系映射(ORM)兼容MySQL,PostgreSQL,SQLite,Oracle。

记住,你可以在settings.py文件中自定义你想使用的数据库。Django可以同时运行复数数据库,甚至可以用你喜欢的方式来操作远程数据库。

一旦你已经创建了你的数据模型,就可以使用API来操作它们。想要知道更多有关于数据模型的信息,可以访问:https://docs.djangoproject.com/en/1.8/ref/models/.

创建对象

打开终端输入以下命令来打开交互界面:

python manage.py shell

输入以下内容:

>>>  from django.contrib.auth.models import User
>>>  from blog.models import Post
>>>  user = User.objects.get(username='admin')
>>>  Post.objects.create(title='One more post', slug='one-more-post', body='Post body.', author=user) 
>>>  post.save ()

让我们分析一下上面的代码:

首先,我们检索用户名为admin的User对象。

user = User.objects.get(username='admin')

get()方法允许你从数据库中检索单个对象,这个方法返回一个匹配的对象,如果没有检索到该对象,这个方法将会抛出DoesNotExist(对象不存在)的错误。如果有多个结果匹配,则会抛出一个MultipleObjectsReturned(返回复数对象)的错误,这两个异常都是当前正在查询的模型类的属性。

接着,我们创建一个自定义的标题(title)、简短标题(slug)、文章内容(body)、还有设置我们刚才检索出来的user对象,作为文章的作者(Author)

post = Post(title='Another post', slug='another-post', body='Post body.', author=user)

然后,我们用save()方法来保存刚刚创建的Post对象。

post.save()

这一动作将会在SQL后台注入Post对象,我们已经知道如何在内存中创建一个Post对象并把它保存到数据库中。当然,我们也可以用create()方法来直接在数据库中创建一个Post对象。

Post.objects.create(title='One more post', slug='one-more-post', body='Post body.', author=user)

更新对象

现在,我们改变一下刚刚创建的Post对象的标题并再次保存它:

>>>  post.title = 'New title'
>>>  post.save ()

这次,save()方法执行了更新数据库(UPDATE SQL)语句

注意:直到你执行save()方法,你对对象的更改才会保存到数据库中。

检索对象

Django的对象关系映射(ORM)基于QuerySet(查询集),你可以通过多种过滤方式来限制返回结果。你已经知道可以通过get()方法来从数据库中获取单个对象。正如你所见,可以使用Post.objects.get()来获取指定对象。每个Django模型至少含有一个名叫objects的默认管理器。在不知不觉中,你已经通过控制器获取了对象。同样,你也可以使用Post.objects.all()来获取所有对象。

>>> all_posts = Post.objects.all()

这就是如何从一个数据库中获取所有对象的方法:通过管理器objects要求它返回所有对象。但是要注意一点:上述语句并没有在数据库中立即执行,究其原因,是因为QuerySet其实非常“懒惰”,它会谨慎的评估是否需要立即执行SQL语句。而正是因为这个“懒惰”的特性,才让它十分高效。举个例子说吧:如果我们不是把QuerySet保存到变量(all_posts = Post.objects.all()),而是打开Python shell,输入Post.objects.all(),SQL语句就会立即执行,是因为我们“强迫”它给我们一个交代:把查询结果输出到控制台.

>>> Post.objects.all()

使用管理器的filter()方法

如果我们只想查询符合条件的对象集合,可以使用管理器的filter()方法。举个例子,如果我们只想从所有对象中查询2015年发布的文章,那么可以用:Post.objects.filter(publish__year=2015)

还有,你可以添加复数过滤条件。例如,我们想查询作者Admin在2015年发布的文章:

Post.objects.filter(publish__year=2015, author__username='admin')

Post.objects.filter(publish__year=2015)\
             .filter(author__username='admin')

以上两条语句可以达到相同的查询结果。

不知道你有没有注意到,我们使用字段过滤查询结果,连着用了两个下划线(publish__year),而访问相关联模型(User)的字段(author)时,也用了两个下划线(author_username)。

使用管理器的exclud()方法

有时候你想从过滤结果中剔除不合格的结果,可以使用管理器的exclud()方法,比如,我们想查询所有2015年发布的文章,但是剔除以“Why”开头的文章:

Post.objects.filter(publish__year=2015)\
            .exclude(title__startswith='Why')

使用管理器的order_by()方法

如果想要让查询结果按照某种规则排序的时候,可以使用管理器的order_by()方法。举个例子,如果你想让查询结果按照发布日期升序排序,可以使用:(译者注:原文是使用title作为排序方式,也就是按字母排序,译者觉得如果是中文标题按照title排序,效果不明显,所以改用publish排序)

Post.objects.order_by('publish')

升序规则是默认的,如果你想让查询结果按照发布日期降序排序,可以这么做:

Post.objects.order_by('-publish')

使用管理器的order_by()方法

如果你想删除某个对象,可以用:

post = Post.objects.ge
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇使用sklearn进行集成学习——实践 下一篇Python初学者(二)

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目