第六章目录
模型的操作
回顾
上一章中我们建立了一个博客文章的模型,然后通过数据迁移建立我们对应中的数据库表,这一章我们接着说模型的操作,这一章的小部分内容可能需要大家对数据库操作有一点熟悉。相信大家都是抱着学习Django的目的来看这一套入门笔记,我就不敢再各位数据库大佬们面前班门弄斧了,直接进入本章学习了。
SQLite的启动
对数据库的操作可以利用GUI工具,也可以通过命令行sqlite3 db.sqlite3
,我们在db.sqlite3所在的目录下使用上述命令,就可以进入到db.sqlite3数据库,如果本地开发中没有配置 SQLite环境,可以自行搜索如何配置。
如果我们输入命令,看到如下信息,说明进入成功:
~/DjangoProject/myblog $ sqlite3 db.sqlite3 SQLite version 3.29.0 2019-07-10 17:32:03 Enter ".help" for usage hints. sqlite>
然后我们使用“.tables”即可查看当前数据库中的数据库表的名称,除了blog_blogarticles是我们通过BlogArticles模型建立的,其余的都是项目默认创建的数据库表。
~/DjangoProject/myblog $ sqlite3 db.sqlite3 SQLite version 3.29.0 2019-07-10 17:32:03 Enter ".help" for usage hints. sqlite> .tables auth_group blog_blogarticles auth_group_permissions django_admin_log auth_permission django_content_type auth_user django_migrations auth_user_groups django_session auth_user_user_permissions sqlite>
接下来使用pragma table_info(blog_blogarticles);
命令来查看blog_blogarticles表的结构:
sqlite> .header on sqlite> pragma table_info(blog_blogarticles); cid|name |type |notnull|dflt_value|pk 0| id |integer |1 | |1 1|title |varchar(300)|1 | |0 2|body |text |1 | |0 3|publish |datetime |1 | |0 4|author_id|integer |1 | |0 sqlite>
.header on 开启头部显示
SQLite 的 PRAGMA 命令是一个特殊的命令,可以用在 SQLite 环境内控制各种环境变量和状态标志。一个 PRAGMA 值可以被读取,也可以根据需求进行设置。
我们可以大致查看上面的表结构,cid是指列id,name是指列名,type是指列类型,notnull非空,值为1表示True,dflt_value是指default默认值(这一列没有值,说明设置设置默认值),pk是指primary_key主键。
大家可以跟我们在前一章中的数据模型BlogArticles所规定的字段和属性进行对比,是不是刚好我们利用数据迁移成功将数据模型转化为数据库表。
创建超级管理员
我们可以在命令行中输入python manage.py createsuperuser
创建一个Django超级管理员,输入用户名和密码,当提示Superuser created successfully,创建成功。如下:
~/DjangoProject/myblog $ python manage.py createsuperuser Username (leave blank to use 'yuzhou_1su'): zoeu Email address: test@test.com Password: Password (again): Superuser created successfully.
然后我在浏览器输入http://127.0.0.1:8000/admin/ ,就可以打开如下界面:
输入刚才创建的超级管理员的用户名和密码就可以进入系统,如图:
Groups和Users是Django在用户管理应用中默认的用户分类。为了让我们得管理员用户能够发布博客,我们需要在./blog/admin.py 文件中,加入如下代码:
from django.contrib import admin # 新增,将BlogArticles类引入到当前环境中 from .models import BlogArticles # 将BlogArticles注册到admin中 admin.site.register(BlogArticles)
刷新页面,我们可以得到如下的页面:
超级管理员界面先放在这,我们回到模型操作。
试验模型API
使用Python进行开发的一个重要优点是交互式shell。我们在./blog/models.py中创建了数据模型后,Django就会自动提供数据库抽象的API,这是一种快速尝试和试验API的方法。通过这个API我们可以快速创建、获取、修改和删除对象,对此我们称之为ORM(Object-Relational Mapper)
我们可以使用manage.py 工具加载我们的项目来启动 Python shell :
python3 manage.py shell
Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 16:52:21) [Clang 6.0 (clang-600.0.57)] on darwin Type "help", "copyright", "credits" or "license" for more information. (InteractiveConsole) >>>
请特别注意我们进入shell的方式,不是直接在命令行中敲python3,虽然这与直接输入python指令来调用交互式控制台是非常相似。
区别是我们利用manage.py工具,将项目将被添加到sys.path并加载Django。这意味着我们可以在项目中导入我们的模型和其他资源并使用它。
让我们从导入BlogArticles类开始:下面就可以开始我们对数据库的增、删、改、查等操作。
$ python3 manage.py shell Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 16:52:21) [Clang 6.0 (clang-600.0.57)] on darwin Type "help", "copyright", "credits" or "license" for more information. (InteractiveConsole) >>> from django.contrib.auth.models import User >>> from blog.models import BlogArticles >>> admin = User.objects.get(username="zoue") >>> admin.username 'zoeu' >>> admin.id 1 >>> admin.password 'pbkdf2_sha256$150000$b9j0ZKBVZSo1$l+fEIiKIaS6u1mhjMPOX1qR0xMOaemnRJIwiE2lNn60=' >>> admin.email 'test@test.com' >>> type(admin) <class 'django.contrib.auth.models.User'>
以上是对用户的查询操作是不是刚好是我们上一节中在创建管理员的内容,恭喜你!
接下来,我们对博客文章进行操作,要创建新的 BlogArticle 对象,我们可以执行以下操作:
- 增
>>> BlogAriticle01 = BlogArticles(title ='DjangoNotes_Day01', author=zoue, body='Django是啥?');
为了将这个对象保存在数据库中,我们必须调用save方法:
>>> BlogAriticle01.save()
save
方法用于创建和更新对象。这里Django创建了一个新对象,因为这时BlogAriticle01 实例没有id。第一次保存后,Django会自动设置ID:
>>> BlogAriticle01.id 4
因为我自己在之前创建过其它文章,所以这个id 值为4,如果你是按照本入门笔记一步步操作过来,id 值应该为1。
当然,还可以查看其它属性,这里统一将命令敲出来:
>>> BlogAriticle01.title 'DjangoNotes_Day01' >>> BlogAriticle01.author <User: admin> >>> BlogAriticle01.body 'Django是啥?' >>> BlogAriticle01.publish datetime.datetime(2019, 9, 30, 19, 56, 58, 735676) >>>
每个Django模型都带有一个特殊的属性; 我们称之为模型管理器(Model Manager)。你可以通过属性objects 来访问这个管理器,它主要用于数据库操作。例如,我们可以使用它来直接创建一个新的Board对象:
>>> BlogArticle02 = BlogArticles.objects.create(title='Python', author=admin, body='Head First to Python.') >>> BlogArticle02.id 5
- 改
要更新一个值,我们可以利用如下操作:
>>> BlogAriticle01.body = 'I love Django, 但是我太难了' >>> BlogAriticle01.body 'I love Django, 但是我太难了'
- 查
>>> blogs = BlogArticles.objects.all() >>> blogs <QuerySet [<BlogArticles: Python>, <BlogArticles: DjangoNotes_Day01>, <BlogArticles: right here waiting>, <BlogArticles: Yesterday once more>, <BlogArticles: You Raise me up>]>
结果是一个QuerySet,我们可以将这个QuerySet看作一个列表。假设我们想遍历它并打印每个模块的标题。
>>> for blog in blogs: ... print(blog.title) ... Python DjangoNotes_Day01 right here waiting Yesterday once more You Raise me up >>>
同样,我们可以使用模型的 管理器(Manager) 来查询数据库并返回单个对象。为此,我们要使用 get 方法:
>>> BlogArticles.objects.get(id=5) <BlogArticles: Python>
- 删
>>> BlogArticles.objects.get(id=5).delete() (1, {'blog.BlogArticles': 1})
删除后再重新查看一下QuerySet,发现没有了<BlogArticles: Python>,说明删除成功。
>>> blogs = BlogArticles.objects.all() >>> blogs <QuerySet [<BlogArticles: DjangoNotes_Day01>, <BlogArticles: right here waiting>, <BlogArticles: Yesterday once more>, <BlogArticles: You Raise me up>]>
除了get方法,其实也可以用filter进行筛选查询id=5然后删除,
BlogArticles.objects.filter(id=5).delete()
,关于filter方法我们将在后面的文章中进行介绍。
总结
下面是我们在本节中关于模型学到的方法和操作,使用BlogArticles模型作为参考。大写的 BlogArticles指的是类,BlogArticles01指BlogArticles的一个实例(或对象)
操作 | 代码示例 |
创建一个对象而不保存 | BlogAriticle01 = BlogArticles() |
保存一个对象(创建或更新) | BlogAriticle01.save() |
数据库中创建并保存一个对象 | BlogArticle02 = BlogArticles.objects.create(title=’…’, author=…, body=’…’) |
列出所有对象 | BlogArticles.objects.all() |
通过字段标识获取单个对象 | BlogArticles.objects.get(id=5) |
通过字段标识删除单个对象 | BlogArticles.objects.get(id=5).delete() |
怎么样,学到这里的读者是不是很激动啊。我发现我在写这些文字的时候也是重复练手的好机会,加深我对模型操作的印象,也希望大家通过多做练习明白这些操作。