Django 设计系统表

218 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第15天,点击查看活动详情

Django 模型

在当代Web应用中,主观逻辑经常牵涉到与数据库的交互。数据库驱动网站 在后台连接数据库服务器, 从中取出一些数据,然后在Web页面用漂亮的格式展示这些数据。这个网站也可能会向访问者提供修改数据 库数据的方法。许多复杂的网站都提供了以上两个功能的某种结合。

对于我们的发布会签到系统来说,需要数据库的支持。有人说如果要开发一个Web系统,那么数据库表 的设计完成,相当于Web系统已经开发了一半了,可见数据库表的设计难度和在Web开发中的重要性。

设计系统表

Django 提供完善的模型(model)层主要用来创建和存取数据,不需要我们直接操作数据库。它很好的 建立了代码与数据表之间的映射,所以,我们可以通过编写代码的方式来完成表的创建,同样通过编写代码 来完成数据库的操作(增、删、查、改)。

打开.../sign/models.py文件,完整表的创建。

image.png

image.png

对于发布会来说,显然它是一个事件。时间、地点、人物等要素必不可少。数据库表的设计需要围绕着 这些要素进行。

关于发布会表(Event类)和嘉宾表(Guest类)的每一个字段,在代码中已经做了注解。这里捡几个字 段解释一下。

首先,发布会表中增加了status 字段用于表示发布会的状态是否开启,用于控制该发布会是否可用。 其次,嘉宾表中通过event_id关联发布会表,一条嘉宾信息一定属于某一场发布会。

最后,对于发布会来说,一般会选择手机号作为一位嘉宾的验证信息,所以,对于一场发布会来说,一 个手机号只能出现一次。发布会id+手机号来做为联合主键。

str_0方法告诉

Python如何将对象以str的方式显示出来。所以,为每个模型类添加了str0方法。

(如果读者使用的是Python2.x的话,这里需要使用_unicode_0)。

Django 数据类型,如下表:

image.png image.png

进行数据库迁移:

image.png

image.png

admin 后台管理

通过admin后台管理用户组/用户表非常方便。那么,我们创建的发布会和嘉宾表同 样可以通过admin去管理。

打开.../sign/admin.py文件。

image.png

这些代码通知 admin 管理工具为这些模块逐一提供界面。

登录admin后台。

image.png

现在点击“Add”添加一条发布会(Event)数据。

image.png

显示的是数据对象,如何才能显示表数据呢?继续修改../sign/admin.py文件。

image.png

我们新建了一个类EventAdmin,它是从django.contrib.admin.ModelAdmin派生出来的子类,保存着一个 类的自定义配置,以供admin管理工具使用。这里只自定义了一项:list_display,它是一个字段名称的数组, 用于定义要列表中显示哪些字段。当然,这些字段名称必须是模型中的EventO类定义的。

接下来修改admin.site.register()调用,在Event后面添加了EventAdmin。你可以这样理解:用EventAdmin 选项注册Event模块。

当然,我们顺带对Guest 模块也做了同样的操作。 保存代码后,重新刷新Event列表,如图

image.png

再接下来,点击“Add”添加一条嘉宾(Guest)数据。如图

image.png

当然,admin后台管理的可定制性很高,我甚至可以方便生成搜索栏和过滤器。重新打开../sign/admin.py 文件。

image.png

search_fields 创建字段搜索器,可以设置搜索关键字匹配多个字段。list_filter 创建字段过滤器。 查看 Event 列表或者 Guest列表,如图

image.png

image.png

基本数据访问

这一小节将会练习数据库表的操作,manage.py提供的shell命令,我们可以在该模式下操作数据库表。

image.png

虽然,这看上去很像 Python的shell模式。但Python的shell 模型并不能操作 Django项目的相关模型。 而Django特别为我们准备的shell模型下却能做到这一点。

image.png

导入sign应用下的models.py中的Event表和Guest表。

table.objects.all()

获得 table表中的所有对象。

插入数据

image.png

因为start_time 字段字段需要设置日期时间,所以导入和datetime.datetime(方法。但是,我们收到了一行 警告信息“RuntimeWarning:DateTimeField Event.start_time received a naive datetime (2016-08-10 14:00:00) while time zone support is active.”

这跟UTC有关,如果读者感兴趣可以百度UTC是什么?这里,我们暂时忽略掉这个问题,最简单的方 式就是在.../settings.py 文件中设置:USE_TZ=False。

修改 settings.py 文件后需要执行“quit”命令退出,然后重新执行“Python3 manage.py shell”进入才会生效果。

如果你觉得创建和保存分两步完成太过麻烦,也可以通过table.objects.create()方法将两步合为一步,方 法如下。

image.png

需要说明的是,表的id字段已经设置了自增,所以,该字段为空可以添加数据,但在创建嘉宾时数据时 需要指定关联的发布会id。Event表指定了id=3,,Guest 表指定 event_id=3。

查询数据

查询无疑是数据库表中使用频率最高的操作。

table.objects.get(方法是从数据库的取得一个匹配的结果,返回一个对象,如果记录不存在的话,它会报 错。

通过name '红米MAX发布会'做为查询条件

image.png

image.png

因为name='发布会'并没有完全匹配到发布会名称,所以table.objects.get()方法会抛出DoesNotExist异常, 但有些时候我们会使用模糊查询。

table.objects.filter()方法是从数据库的取得匹配的结果,返回一个对象列表,如果记录不存在的话,它会 返回]。

image.png

还可以模糊匹配多个关键字。

通过嘉宾信息查询其关联的发布会。查看phohone='13611001101'这位嘉宾所参加的发布会信息

image.png

删除数据

查询 phone='13611001101' 的嘉宾,通过 delete(0方法删除。

image.png

更新数据

查询 phone='13611001101' 的嘉宾,更新 realname='andy2'

image.png