Django ORM
在前一章,我们利用 Django Admin 新增、修改及删除 Post 。而实际在写程式时,我们会使用 Django 提供的 QuerySet API,来达成类似的资料库操作。
本章你会学到:如何使用 Django QuerySet API 与资料库互动 (CRUD)。
CRUD 指的是, C reate (新增)、 R ead (读取)、 U pdate (修改)、 D elete (删除) 等常见的资料库操作。
使用 Django Shell
与先前不同的是,在这裡我们不使用 Python Shell,而是 Django Shell 。
使用 shell 指令,进入 Django Shell:
(djangogirls_venv) ~/djangogirls/mysite$ python manage.py shell
这个 shell 和我们之前输入 python
执行的 shell 长得一样,只是它会预先为我们设定 Django 需要的环境,方便我们执行 Django 相关的程式。
IPython
IPython 是强化版的 Python 互动式命令列介面,它比预设的命令列介面多了许多进阶功能,例如:
- 按 tab 键可以补齐未输入完的指令、档案及资料夹名称。
- 按 ↑ 键和 ↓ 键可以浏览输入过的程式码,便于微调先前的程式码(修改参数等等)。
- 在套件、模组或函数名称后加上
?
可查看与之相关的资讯。 history
指令可查看所有输入过的指令。- 可以使用 shell 指令,如:
ls
、cd
。
我们一样可以用 pip 来安装这个强大的套件:
(djangogirls_venv) ~/djangogirls/mysite$ pip install ipython
QuerySet API
Create
首先,让我们来试著新增几笔资料:
>>> from trips.models import Post
>>> Post.objects.create(title='My First Trip', content='肚子好饿,吃什麽好呢?', location='台北火车站')
<Post: My First Trip>
>>> Post.objects.create(title='My Second Trip', content='去散散步吧', location='台北火车站')
<Post: My Second Trip>
>>> Post.objects.create(title='Django 大冒险', content='从静态到动态', location='台北市大安区复兴南路一段 293 号')
<Post: Django 大冒险>
Read
若想显示所有的 Post ,可以使用 all() :
>>> from trips.models import Post
>>> Post.objects.all()
[<Post: My First Trip>, <Post: My Second Trip>, <Post: Django 大冒险>]
只想显示部分资料时,则可以使用 get
或 filter
:
>>> Post.objects.get(pk=1)
<Post: My First Trip>
>>> Post.objects.filter(pk__gt=1)
[<Post: My Second Trip>, <Post: Django 大冒险>]
- get :返回符合条件的 唯一一笔资料 。( 注意: 如果找不到符合条件的资料、或是有多笔资料符合条件,都会产生 exception)
- filter :返回符合条件的阵列。如果找不到任何资料则会返回空阵列。
Update
当想修改资料时,可以使用 update 更新一笔或多笔资料:
首先,先取得欲更新的 Post。这裡使用 pk < 3
的条件筛选
>>> posts = Post.objects.filter(pk__lt=3)
共有 2 个 Post 符合上面的条件
>>> posts
[<Post: My First Trip>, <Post: My Second Trip>]
我们将 location 的值印出
>>> posts[0].location
'台北火车站'
>>> posts[1].location
'台北火车站'
>>>
印出后发现, 两个 Post 的 location 都是台北火车站。现在我们试试用 update
指令,把它改成 '捷运大安站'
>>> posts.update(location='捷运大安站')
2
回传的数字 2
指的是已被更新的资料笔数。我们可以验证一下 location
是否皆已被正确更新
>>> posts[0].location
'捷运大安站'
>>> posts[1].location
'捷运大安站'
Delete
我们也可以使用 delete 删除资料:
我们试著使用 delete
,将刚刚的那两笔 Post 删除。
>>> posts.delete()
确认一下,资料是否删除
>>> Post.objects.all()
[<Post: Django 大冒险>]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论