Experimenting with the Models API

使用 Python 进行开发的一大优势是交互式 shell。我用它所有的时间。这是一种快速尝试和试验库和 API 的方法。

您可以使用manage.py 实用程序加载我们的项目来启动 Python shell :

python manage.py shell
Python 3.6.2 (v3.6.2:5fd33b5, Jul  8 2017, 04:57:36) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>

这与仅通过键入调用交互式控制台非常相似 python,除了当我们使用时 python manage.py shell,我们将我们的项目添加到 sys.pathDjango 并加载它。这意味着我们可以导入我们的模型和项目中的任何其他资源并使用它。

让我们从导入Board 类开始:

from boards.models import Board

要创建新的板对象,我们可以执行以下操作:

board = Board(name='Django', description='This is a board about Django.')

要将这个对象持久保存在数据库中,我们必须调用该 save方法:

board.save()

save方法用于创建更新 对象。这里 Django 创建了一个新对象,因为Board 实例没有id 。第一次保存后,Django会自动设置id:

board.id
1

您可以将其余字段作为 Python 属性访问:

board.name
'Django'
board.description
'This is a board about Django.'

要更新一个值,我们可以这样做:

board.description = 'Django discussion board.'
board.save()

每个 Django 模型都有一个特殊的属性;我们称之为模型管理器 。您可以通过 Python 属性访问它 objects。它主要用于在数据库中执行查询。例如,我们可以使用它直接创建一个新的Board 对象:

board = Board.objects.create(name='Python', description='General discussion about Python.')
board.id
2
board.name
'Python'

所以,现在我们有两个板。我们可以使用 objects列出数据库中的所有现有板:

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

结果是一个QuerySet 。稍后我们将了解更多相关信息。基本上,它是来自数据库的对象列表。我们可以看到我们有两个对象,但是我们只能读取Board object 。那是因为我们还没有 __str__Board 模型中定义方法。

__str__方法是一个对象的字符串表示。我们可以用板名来表示。

首先,退出交互式控制台:

exit()

现在编辑板应用程序中的models.py 文件:

class Board(models.Model):
    name = models.CharField(max_length=30, unique=True)
    description = models.CharField(max_length=100)

    def __str__(self):
        return self.name

让我们再次尝试查询。再次打开交互式控制台:

python manage.py shell
from boards.models import Board

Board.objects.all()
<QuerySet [<Board: Django>, <Board: Python>]>

好多了,对吧?

我们可以将这个QuerySet 视为一个列表。假设我们想迭代它并打印每个板的描述:

boards_list = Board.objects.all()
for board in boards_list:
    print(board.description)

结果将是:

Django discussion board.
General discussion about Python.

同样,我们可以使用模型管理器 查询数据库并返回单个对象。为此,我们使用以下 get 方法:

django_board = Board.objects.get(id=1)

django_board.name
'Django'

但是我们必须小心这种操作。如果我们尝试获取不存在的对象,例如带有 的板 id=3,则会引发异常:

board = Board.objects.get(id=3)

boards.models.DoesNotExist: Board matching query does not exist.

我们可以对 get任何模型字段使用该方法,但最好使用可以唯一标识对象的字段。否则,查询可能会返回多个对象,从而导致异常。

Board.objects.get(name='Django')
<Board: Django>

请注意,查询区分大小写 ,小写的“django”将不匹配:

Board.objects.get(name='django')
boards.models.DoesNotExist: Board matching query does not exist.
models操作总结

下面是我们在本节中学习的方法和操作的摘要,使用Board 模型作为参考。大写的Board 指的是类,小写的board 指的是Board 模型类的一个实例(或对象):

Operation代码示例
创建对象而不保存board = Board()
保存对象(创建或更新)board.save()
在数据库中创建和保存对象Board.objects.create(name='...', description='...')
列出所有对象Board.objects.all()
获取单个对象,由字段标识Board.objects.get(id=1)

在下一节中,我们将开始编写视图并在 HTML 页面中显示我们的板。

最后修改:2021 年 06 月 14 日
如果觉得我的文章对你有用,请随意赞赏