完整的 Django 零基础教程|初学者指南 - 第 4 部分 转自:维托尔·弗雷塔斯

2021-08-09 15:26:38 浏览数 (1)

Experimenting with the Models API

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

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

代码语言:javascript复制
python manage.py shell
代码语言:javascript复制
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 类开始:

代码语言:javascript复制
from boards.models import Board

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

代码语言:javascript复制
board = Board(name='Django', description='This is a board about Django.')

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

代码语言:javascript复制
board.save()

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

代码语言:javascript复制
board.id
1

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

代码语言:javascript复制
board.name
'Django'
代码语言:javascript复制
board.description
'This is a board about Django.'

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

代码语言:javascript复制
board.description = 'Django discussion board.'
board.save()

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

代码语言:javascript复制
board = Board.objects.create(name='Python', description='General discussion about Python.')
代码语言:javascript复制
board.id
2
代码语言:javascript复制
board.name
'Python'

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

代码语言:javascript复制
Board.objects.all()
<QuerySet [<Board: Board object>, <Board: Board object>]>

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

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

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

代码语言:javascript复制
exit()

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

代码语言:javascript复制
class Board(models.Model):
    name = models.CharField(max_length=30, unique=True)
    description = models.CharField(max_length=100)

    def __str__(self):
        return self.name

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

代码语言:javascript复制
python manage.py shell
代码语言:javascript复制
from boards.models import Board

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

好多了,对吧?

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

代码语言:javascript复制
boards_list = Board.objects.all()
for board in boards_list:
    print(board.description)

结果将是:

代码语言:javascript复制
Django discussion board.
General discussion about Python.

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

代码语言:javascript复制
django_board = Board.objects.get(id=1)

django_board.name
'Django'

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

代码语言:javascript复制
board = Board.objects.get(id=3)

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

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

代码语言:javascript复制
Board.objects.get(name='Django')
<Board: Django>

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

代码语言:javascript复制
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 页面中显示我们的板。


版权属于:Cyril

本文链接:https://cloud.tencent.com/developer/article/1858343

转载时须注明出处及本声明

0 人点赞