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.path
Django 并加载它。这意味着我们可以导入我们的模型和项目中的任何其他资源并使用它。
让我们从导入Board 类开始:
代码语言:javascript复制from boards.models import Board
要创建新的板对象,我们可以执行以下操作:
代码语言:javascript复制board = Board(name='Django', description='This is a board about Django.')
要将这个对象持久保存在数据库中,我们必须调用该 save
方法:
board.save()
该 save
方法用于创建 和更新 对象。这里 Django 创建了一个新对象,因为Board 实例没有id 。第一次保存后,Django会自动设置id:
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 对象:
board = Board.objects.create(name='Python', description='General discussion about Python.')
代码语言:javascript复制board.id
2
代码语言:javascript复制board.name
'Python'
所以,现在我们有两个板。我们可以使用 objects
列出数据库中的所有现有板:
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
方法:
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”将不匹配:
代码语言: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
转载时须注明出处及本声明