Django ORM
使用 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 大冒险>]
而只想显示部分资料时,则可以使用 get
或 filter
:
>>> 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 大冒险>]
更多建议: