Python 快速教程(Django02):庄园疑云
admin
2023-07-31 00:36:11
0

上一回说到,姜戈的江湖初体验:如何架设服务器,如何回复http请求,如何创建App。这一回,我们要走入糖果庄园。

 

数据库是一所大庄园,藏着各种宝贝。一个没有数据库的网站,所能提供的功能会非常有限。

 

为了找到心爱的人,姜戈决定一探这神秘的糖果庄园。

 

连接数据库

Django为多种数据库后台提供了统一的调用API。根据需求不同,Django可以选择不同的数据库后台。MySQL算是最常用的数据库。我们这里将Django和MySQL连接。

 

在Linux终端下启动mysql:

1 $mysql u root p

 

在MySQL中创立Django项目的数据库:

1 mysql> CREATE DATABASE villa DEFAULT CHARSET=utf8;

这里使用utf8作为默认字符集,以便支持中文。

 

在MySQL中为Django项目创立用户,并授予相关权限:

1 mysql> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES ON villa.* TO \’vamei\’@\’localhost\’ IDENTIFIED BY \’vameiisgood\’;

 

在settings.py中,将DATABASES对象更改为:

12345678910 DATABASES = {    \’default\’: {        \’ENGINE\’: \’django.db.backends.mysql\’,        \’NAME\’: \’villa\’,        \’USER\’: \’vamei\’,        \’PASSWORD\’: \’vameiisgood\’,        \’HOST\’:\’localhost\’,        \’PORT\’:\’3306\’,    }}

后台类型为mysql。上面包含数据库名称和用户的信息,它们与MySQL中对应数据库和用户的设置相同。Django根据这一设置,与MySQL中相应的数据库和用户连接起来。此后,Django就可以在数据库中读写了。

 

姜戈略一迟疑,旋即走入了庄园的大门。

 

创立模型

MySQL是关系型数据库。但在Django的帮助下,我们不用直接编写SQL语句。Django将关系型的表(table)转换成为一个类(class)。而每个记录(record)是该类下的一个对象(object)。我们可以使用基于对象的方法,来操纵关系型的MySQL数据库。

 

在传统的MySQL中,数据模型是表。在Django下,一个表为一个类。表的每一列是该类的一个属性。在models.py中,我们创建一个只有一列的表,即只有一个属性的类:

123456 from django.db import models class Character(models.Model):    name = models.CharField(max_length=200)    def __unicode__(self):        return self.name

类Character定义了数据模型,它需要继承自models.Model。在MySQL中,这个类实际上是一个表。表只有一列,为name。可以看到,name属性是字符类型,最大长度为200。

类Character有一个__unicode__()方法,用来说明对象的字符表达方式。如果是Python 3,定义__str__()方法,实现相同的功能。

 

命令Django同步数据库。Django根据models.py中描述的数据模型,在MySQL中真正的创建各个关系表:

1 $python manage.py syncdb

 

同步数据库后,Django将建立相关的MySQL表格,并要求你创建一个超级用户:

 

Creating tables …
Creating table django_admin_log
Creating table auth_permission
Creating table auth_group_permissions
Creating table auth_group
Creating table auth_user_groups
Creating table auth_user_user_permissions
Creating table auth_user
Creating table django_content_type
Creating table django_session
Creating table west_character

 

You just installed Django’s auth system, which means you don’t have any superusers defined.
Would you like to create one now? (yes/no): yes
Username (leave blank to use ‘tommy’): vamei
Email address: vamei@vamei.com
Password:
Password (again):
Superuser created successfully.
Installing custom SQL …
Installing indexes …
Installed 0 object(s) from 0 fixture(s)

 

数据模型建立了。打开MySQL命令行:

1 $mysql u vamei p

 

查看数据模型:

123 USE villa;SHOW TABLES;SHOW COLUMNS FROM west_character;

 

最后一个命令返回Character类的对应表格:

+——-+————–+——+—–+———+—————-+
| Field | Type         | Null | Key | Default | Extra          |
+——-+————–+——+—–+———+—————-+
| id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(200) | NO   |     | NULL    |                |
+——-+————–+——+—–+———+—————-+
2 rows in set (0.00 sec)

可以看到,Django还自动增加了一个id列,作为记录的主键(Primary Key)。

 

这富丽堂皇的别墅中,姜戈隐隐闻到凶险的味道。

 

显示数据

数据模型虽然建立了,但还没有数据输入。为了简便,我们手动添加记录。打开MySQL命令行,并切换到相应数据库。添加记录:

123 INSERT INTO west_character (name) Values (\’Vamei\’);INSERT INTO west_character (name) Values (\’Django\’);INSERT INTO west_character (name) Values (\’John\’);

查看记录:

1 SELECT * FROM west_character;

可以看到,三个名字已经录入数据库。

 

下面我们从数据库中取出数据,并返回给http请求。在west/views.py中,添加视图。对于对应的请求,我们将从数据库中读取所有的记录,然后返回给客户端:

12345678910 # -*- coding: utf-8 -*- from django.http import HttpResponse from west.models import Character def staff(request):    staff_list = Character.objects.all()    staff_str  = map(str, staff_list)    return HttpResponse(\”\” + \’ \’.join(staff_str) + \”\”)

可以看到,我们从west.models中引入了Character类。通过操作该类,我们可以读取表格中的记录

 

为了让http请求能找到上面的程序,在west/urls.py增加url导航:

12345 from django.conf.urls import patterns, include, url urlpatterns = patterns(\’\’,    url(r\’^staff/\’,\’west.views.staff\’),)

 

运行服务器。在浏览器中输入URL:

127.0.0.1:8000/west/staff

查看效果:

 

从数据库读出数据,显示在页面

 

“我心爱的人,原来你在这里。” 姜戈强自镇定,嘴角忍不住颤动。

 

总结

Django使用类和对象接口,来操纵底层的数据库。

有了数据库,就有了站点内容的大本营。

 

姜戈,风雨欲来。


相关内容

热门资讯

Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
python清除字符串里非数字... 本文实例讲述了python清除字符串里非数字字符的方法。分享给大家供大家参考。具体如下: impor...