Django ORM

2020-06-15 17:41 更新

使用 Django ORM 操作资料库

在上一章,我们学到如何使用 Django Model 抽象地表达资料库结构。 在完成 Model 的定义后,我们即可使用 Django 提供的丰富 API ,来与资料库互动。

本章你会学到:如何使用 Django API 来与资料库互动 (CRUD)。

CRUD 指的是,Create (新增)、Read (读取)、Update (修改)、Delete (删除) 等常见的资料库操作。

使用 Django Shell

与先前不同的是,在这裡我们不使用 Python Shell。若要在 Python Shell 使用 Django 的功能或模组,还需另外载入设定。

所以我们这裡使用的是 Django Shell

Django Shell

与 Python Shell 类似的互动式命令列。会预先载入 Django 的相关设定,所以可以在此执行 Django 的 API。

使用 shell 指令,进入 Django Shell:

python manage.py shell

这个 shell 和我们之前输入 python 执行的 shell 长得一样,只是它会预先为我们设定 Django 需要的环境,方便我们执行 Django 相关的程式。

QuerySet API

Create

首先,让我们来试著新增几笔资料:

>>> from trips.models import Post

>>> Post.objects.create(title='My First Trip', content='肚子好饿,吃什麽好呢?',  location='台北火车站')
<Post: Post object>

>>> Post.objects.create(title='My Second Trip', content='去散散步吧',  location='台北火车站')
<Post: Post object>

>>> Post.objects.create(title='Django 大冒险', content='从静态到动态',  location='台北市大安区复兴南路一段293号')
<Post: Post object>

Read

若想显示所有的 Post ,可以使用all()

>>> Post.objects.all()
[<Post: Post object>, <Post: Post object>, <Post: Post object>]

Django 通常以 <Post: Post object> 来表示 Post 物件,但此种显示不易辨别。我们可以透过 def str 更改 Post 的表示方式,修改 trips/models.py:

# trips/models.py

from django.db import models

class Post(models.Model):
    ...
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title

退出 Django Shell 后再重新进入,Post 已经被重新定义成显示标题,如 <Post: Your_Post_Title>

>>> Post.objects.all()
[<Post: My First Trip>, <Post: My Second Trip>, <Post: Django 大冒险>]

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

>>> Post.objects.get(id=1)
<Post: My First Trip>

>>> Post.objects.filter(id__gt=1)
[<Post: My Second Trip>, <Post: Django 大冒险>]
  • get:返回符合条件的唯一一笔资料。 ( 注意:如果找不到符合条件的资料、或是有多笔资料符合条件,都会产生 exception )

  • filter:返回符合条件的阵列。如果找不到任何资料则会返回空阵列。

Update

当想修改资料时,可以使用 update 更新一笔或多笔资料:

首先,先取得欲更新的 Post。这裡使用 id < 3 的条件筛选

>>> posts = Post.objects.filter(id__lt=3)

共有 2个 Post 符合 id < 3 的条件

>>> 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 大冒险>]
以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号