Django ORM 和 QuerySets(查询集)

学习 Django 如何连接到数据库,并将数据存储在里面。

Django shell

source myvenv/bin/activate进入虚拟环境

python manage.py shell 进入Django的交互控制台中。

注意 这个提示符也是 >>> 但是不是在python 中,而是带有Django特性的python环境中,在这里面可以执行 所有python命令。

所有对象

导入Post

blog.models 导入 Post 的模型。 注意: 这里的 Post 第一个字母是 大写

from blog.models import Post

显示所有的帖子

注意: 这里的PostP也是大写

Post.objects.all()

20170826150374928518012.png

这里的文章,都是我们之前在(4.Django admin 管理后台)这一节的时候创建的帖子。

之前是通过 Django admin创建的,现在我们要血蹄如何通过Python来创建新的文章。

创建对象

导入用户模型

from django.contrib.auth.models import User

查看数据库中有哪些用户

User.objects.all()

获取用户实例

me = User.objects.get(username='zfl420')

赋值给me 现在 一个 username 等于 zfl420User

创建文章

这个时候,这里的author 会用到 me

Post.objects.create(author=me, title='Sample title', text='Test')

检查是否有效

Post.objects.all() 这是显示所有文章的语句,上面学的。我们会发现,这个时候多了一篇文章,就是通过刚刚的语句创建的。

20170826150375036526096.png

添加更多文章

再练习一下,通过

 Post.objects.create(author=me, title='标题名称', text='帖子内容') 

创建文章。通过

Post.objects.all() 

显示所有文章。

筛选对象

通过filter 来筛选,在括号中填入条件。

筛选author = me 的文章

Post.objects.filter(author=me)

筛选 文章标题是 wenzhang1的文章

Post.objects.filter(title='wenzhang1')

筛选文章标题包括 wen 的所有文章,这个时候我们需要用到title__contains 注意:中间是两个_

Post.objects.filter(title__contains='wen')

20170826150375133825667.png

获取已发布文章列表

我们通过筛选所有含published_date为过去时间的文章来实现这个目的:

from django.utils import timezone Post.objects.filter(published_date__lte=timezone.now())[]

不幸的是,通过Python终端添加的文章还没发布。我们可以改变它!首先获取一个我们想要发布的文章实例:

>>> post = Post.objects.get(title="Sample title")

然后将它与我们 publish 的方法一起发布 !

>>> post.publish()

现在再一次尝试获取已发布的文章(按向上箭头按钮三次,然后按回车):

>>> Post.objects.filter(published_date__lte=timezone.now())
<QuerySet [<Post: Sample title>]>

对象排序

Post.objects.order_by('created_date')

20170826150375180374770.png

也可以在created_date前面加一个 -查询倒序

Post.objects.order_by('-created_date')

20170826150375194090936.png

链式 QuerySets

也就是两个语句链接在一起查询,先查询出前面的结果再排序。

Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date')

20170826150375256157626.png

关闭 shell程序

exit()
Comments
Write a Comment