前言
本篇将介绍Django如何建立数据库,如何创造你的第一个模型,还会接触到Django自带的后台管理系统,
数据库配置
数据库连接
打开 demo_proj/settings.py,Django 项目的配置都在此。 Python 内置了 SQLite,你无需安装就可以使用它,但当你开始一个真正的项目时,你可能更倾向使用一个更具扩展性的数据库,例如 MySQL, 在配置文件中使用 SQLite 作为默认数据库,我们的演示也用SQLite。以下就是数据库的配置项:
ENGINE
数据库引擎,看你是选择哪种数据库,是SQLite,或者 是MySQL,还是其他,可选值有
name
数据库名称,如果是 SQLite,数据库将是你电脑上的一个文件,那么, NAME 应该是此文件的绝对路径,包括文件名。默认值 os.path.join(BASE_DIR, 'db.sqlite3') 将会把数据库文件储存在项目的根目录。
创建数据库
Django是通过 migrate
命令来检查 settings.py 文件中的 INSTALLED_APP 配置项,为其中的每个应用创建数据表的。
先来关注下 INSTALLED_APP
配置项,我们在Django项目中所有的应用对会包括在此(上篇文章创建的 demo_app
也要手动加到这配置项里)。通常 INSTALLED_APP
会默认包括以下自带的应用
这些应用被默认启用是为了给项目提供方便,比如 django.contrib.admin
会帮你建立个管理后台, django.contrib.auth
会极大方便登录验证,等等,后续我们会陆续介绍到。这些应用都需要数据表,比如 django.contrib.admin
是后台管理,那么就必须要有后台管理员。那么就要求数据库中必须有类似user表的来维护管理员数据。
Django 通过 migrate
命令 根据 不同的app 来创建不同的表,执行命令
当看到 如下反馈就表示执行成功:
我们可以查看数据库,会发现多了许多的表,如图所示:
创建模型
模型是真实数据的简单明确的描述,它包含了存储的数据所必要的字段和行为。每一个模型映射一个数据库表,一般都写在 models.py
中。
打开 demo_app
中的models.py 文件,修改代码如下:
在Cat 类 我们定义了 __str__()
方法,这个方法用来有什么作用,大家可以自己找找答案。
那我们如何把我们刚建的Cat类映射到数据表中呢?执行如下命令即可:
我们查看数据库,会发现了多了Cat这个表
这样,我们新建的模型就和数据库中的表建立起了映射关系了。那我们如何操作模型呢,也就是我们如何实现对数据库进行增删改查操作呢?Django 为我们提供了各种API,我们进入交互式Python命令行来体验下:
至此,Django如何配置数据库,如何创建model,如何把model映射到数据库中以及对model的操作我们都以熟悉了下,我们将在后面的课程中的更加深入的介绍model的一些用法。
Django 管理后台
Django 为我们提供了功能强大的后台。在后台中,我们可以利用Django自带的功能对定义的对象进行添加,修改,和删除。
创建一个管理员账号
要登录到后台,首先必须有管理员账户,运行如下命令:
启动我们的工程,在浏览器中输入 http://127.0.0.1:8000/admin/
,系统会跳转到后台系统的登录页面:
输入我们刚才建立的管理员账号和密码,我们会进入到后台管理系统的索引页
我们刚才建立的Cat类在哪里呢?别急,要想在后台看到这个类还得告诉后台系统,Cat类需要被管理,打开 demo_app
/admin.py 文件:
刷新页面,就可以看到我们定义的Cat类了:
点击Cat,系统就会跳转的Cat 对象的列表页面,我们刚才演示的操作API 新建的 Cat 对象也在此
点击 miaomiao 就进入到编辑页面
编辑和删除功能都能实现。
model字段类型
在介绍了上面的内容之后,我再来补充介绍下常用的Djano字段类型。
- models.AutoField :默认会生成一个名称为 id 的列,如果要显示的自定义一个自增列,必须将给列设置为主键 primary_key=True。
- models.NullBooleanField :允许 NULL 作为其中一个选项。推荐使用这个字段而不要用 BooleanField 加 null=True 选项。admin 用一个选择框, <select> (三个可选择的值:“Unknown”, “Yes” 和 “No” ) 来表示这种字段数据。
- models.Decimal:必须指定整数位
max_digits
和小数位decimal_places
- models.DateField:对于参数,
auto_now = True
则每次更新都会更新这个时间;auto_now_add
则只是第一次创建添加,之后的更新不再改变。同(models.DateTimeField)