返回介绍

Django ORM

发布于 2025-02-27 00:22:13 字数 4226 浏览 0 评论 0 收藏 0

在前一章,我们利用 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 指令,如: lscd

我们一样可以用 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 大冒险>]

只想显示部分资料时,则可以使用 getfilter

>>> 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文