Python Django快速入门(二)

继续上一篇的内容,这篇快速介绍Django的数据库模型。

Django支持4种数据库,PostgreSQL,SQLite3,MySQL,Oracle。这里我们忽略数据库的配置,直接使用默认已经配置完成的SQLite3数据库,重点关注Python代码的实现。Django已经将数据库进行了完善的封装,通过同样的代码,就可以操作多种数据库,会自动生成对应的SQL等语句操作数据库。

定义数据库模型

在app/modules.py中输入以下代码,模型即定义完成。通常一个应用对应了一个数据库,而modules中的每个class对应数据库的一个表,每个成员变量对应了一个字段。这几个类都是继承自models.Model父类的,在父类中已经实现了各种数据库的操作。其中有一些特例,在Book中的authors是一个多对多的关系类型,表示每本书(Book)可以对应多个作者(Author),反过来,每个作者也可以对应多本书(在SQL中,这种对应关系通过一张表实现);Book中的publisher对应了一个Publisher外键。

添加应用

在settings中INSTALLED_APPS添加一行,将创建的应用app添加进去(使用数据库模型时需要安装应用,否则可以不用)

同步数据库

在项目文件夹下运行manage.py validate,可以验证模型的有效性

运行manage.py sqlall app,可以看到生成的SQL语句。如果发生图中错误,提示

CommandError: App ‘app’ has migrations. Only the sqlmigrate and sqlflush commands can be used when an app has migrations.

这句话的意思是应用’app’被改动了,只能使用sqlmigrate和sqlflush命令,而不能新建数据表。

解决方法是,删除app对应文件夹下的migrations子文件夹即可(因为我们的模型之前并没有创建,所以也不存在模型被修改的问题)。

正常执行sqlall语句结果如下:

生成的是SQL语句,只是用来预览的,但还没有被实际执行。通过执行manage.py syncdb指令即可创建数据库。由于在INSTALLED_APPS中还有默认生成的后台管理App,所以会提示是否创建管理员账户,如图所示。

输入yes,然后按提示输入管理员用户名和密码即可创建管理员账户。

需要注意的是,syncdb命令根据INSTALLED_APPS创建之前没有创建过的表,但不会将模型的修改和删除同步到数据库。

在shell中操作模型

执行manage.py shell可以进入shell操作模型。输入Python代码新建对象,即可插入模型数据库,代码如下。

from app.models import Publisher

p1 = Publisher(name=‘Apress’, address=‘2855 Telegraph Avenue’, city=‘Berkeley’, state_province=‘CA’, country=‘U.S.A.’, website=‘http://www.apress.com/’)

p1.save()

以下代码可以列出数据表中所有的对象

Publisher.objects.all()

输入的是object,显示形式如下。不能很直观的看到具体的数据。

[, ]

为了显示效果更好,可以给modules.py中的每个类添加__unicode__()方法。写法如下:

为了使代码更改生效,需要重新进入shell(按Ctrl+Z然后回车退出shell,重新执行manage.py shell进入shell)。执行from app.models import Publisher语句,并再次调用Publisher.objects.all(),显示效果如下。

管理页面的查看

用manage.py runserver 0.0.0.0:8000命令启动服务器,浏览器中输入

http://localhost:8000/admin/

即可进入管理页面

输入之前设定的管理员账号和密码,即可登录。页面中可以显示并管理用户组和用户。

注册数据库模型

修改app/admin.py,向管理页面注册数据库模型,代码如下:

刷新后台页面,即可用图形化界面管理数据库模型了,非常方便。

用网页输出模型中的数据

在app/views.py中,添加函数如下。该函数用于从数据模型Publisher中搜索名字中包含name的项,并显示

设置路由如下:

输入以下网址可以显示搜索出的一条结果

输入以下网址,没有结果

第二版的Django项目也完成了,提供源码下载。

可在github下载源码:https://github.com/jzj1993/Django-Quick-Start/