Django ORM – 插入、更新和删除数据
Django让我们与它的数据库模型进行交互,即通过一个叫做ORM(Object Relational Mapper)的数据库抽象API来添加、删除、修改和查询对象。本文讨论了我们可以使用Django ORM进行的所有有用操作。
出于示范目的,我们将使用以下Django模型。
class Album(models.Model):
title = models.CharField(max_length = 30)
artist = models.CharField(max_length = 30)
genre = models.CharField(max_length = 30)
def __str__(self):
return self.title
class Song(models.Model):
name = models.CharField(max_length = 100)
album = models.ForeignKey(Album, on_delete = models.CASCADE)
def __str__(self):
return self.name
我们可以通过在我们的项目目录下运行以下命令来访问Django ORM。
python manage.py shell
这就把我们带到了一个交互式Python控制台。假设我们的模型存在于myProject/albums/models.py中,我们可以使用以下命令导入我们的模型。
>>> from books.models import Song, Album
插入对象
为了创建一个模型Album的对象并将其保存到数据库中,我们需要编写以下命令。
>>> a = Album(title = "Divide", artist = "Ed Sheeran", genre = "Pop")
>>> a.save()
要创建一个Song模型的对象并将其保存到数据库中,我们需要编写以下命令。
>>> s = Song(name = "Castle on the Hill", album = a)
>>> s.save()
检索对象
为了便于演示,我们再增加2个专辑记录。
>>> a = Album(title = "Abbey Road", artist = "The Beatles", genre = "Rock")
>>> a.save()
>>> a = Album(title = "Revolver", artist = "The Beatles", genre = "Rock")
>>> a.save()
为了检索一个模型的所有对象,我们编写以下命令。
>>> Album.objects.all()
<QuerySet [<Album: Divide>, <Album: Abbey Road>, <Album: Revolver>]>
输出是一个 QuerySet,或者说是一个符合查询的对象集。注意,所打印的名称是 str() 函数的输出。
我们还可以使用函数filter()、exclude()和get()来过滤查询。filter()函数返回一个QuerySet,其中有符合给定查询参数的对象。
>>> Album.objects.filter(artist = "The Beatles")
<QuerySet [<Album: Abbey Road>, <Album: Revolver>]>
exclude()函数返回一个查询集,其中的对象不是与给定查询参数相匹配的对象。
>>> Album.objects.exclude(genre = "Rock")
<QuerySet [<Album: Divide>]>
get()函数返回一个与给定查询参数匹配的单一对象。当查询返回多个对象时,它会给出一个错误。
>>> Album.objects.get(pk = 3)
<QuerySet [<Album: Revolver>]>
修改现有对象
我们可以按以下方式修改一个现有的对象。
>>> a = Album.objects.get(pk = 3)
>>> a.genre = "Pop"
>>> a.save()
删除对象
要删除一个对象,我们需要编写以下命令。
>>> a = Album.objects.get(pk = 2)
>>> a.delete()
>>> Album.objects.all()
<QuerySet [<Album: Divide>, <Album: Revolver>]>
要删除多个对象,我们可以使用filter()或exclude()函数,如下所示。
>>> Album.objects.filter(genre = "Pop").delete()
>>> Album.objects.all()
<QuerySet []>