Django 快速实战入门(五):数据模型

ORM 与 CRUD

在当今绝大多数的 Web 应用中,数据库已经成为不可或缺的一个重要组成部分。对于许多应用来说,使用传统的开发方法,仍然要编写不少 SQL 语句,让许多开发者感到枯燥乏味。

由此,在许多面向对象的开发模型中,引入了对象关系映射(ORM )机制,对关系数据库进行抽象与建模。引入了 ORM 之后,对数据库的操作不再是直接通过 SQL 语句,而是直接操作于数据对象。

Django 作为一个优秀的 Web 开发框架,它也实现了 ORM,支持 CRUD。在许多应用中,SQL 语句大多数都是比较简单的,因此 CRUD 基本上能满足大多数场合的应用,大大提升了开发效率。

下面我们就要使用 Django 的 ORM 机制,建立一个简单的留言板,来领略一下无 SQL 的应用开发。

配置数据库

在这部分,我们将使用 MySQL 作为留言数据的存储引擎,如果你还没安装 MySQL 和 MySQLdb,请回到第二节进行安装。

要在 Django 项目中使用数据库,我们需要修改一下项目目录下的 settings.py,这里以 MySQL 为例,修改以下数据库相关的选项:

DATABASE_ENGINE = ‘mysql’           # ‘postgresql_psycopg2’, ‘postgresql’, ‘mysql’, ‘sqlite3’ or ‘oracle’.
DATABASE_NAME = ‘mydb’             # Or path to database file if using sqlite3.
DATABASE_USER = ‘root’             # Not used with sqlite3.
DATABASE_PASSWORD = ‘hily’         # Not used with sqlite3.
DATABASE_HOST = ”             # Set to empty string for localhost. Not used with sqlite3.
DATABASE_PORT = ”             # Set to empty string for default. Not used with sqlite3.

(注意,在大多数情况下,直接把 root 作为 Web 应用的数据库用户是不安全的,这里是为了简便才这样做的。)

新建 Django 应用

在 Django 中,项目为应用提供了运行环境,一个项目中可以包含多个应用,同一个项目下的应用共享着项目的配置信息,如数据库配置、模板路径、时区等信息。一个应用以一个包的形式存在,便于重用和移植。

第一节的 Django 架构图中我们可以看到,数据模型(Model)是存在于应用(Application)之中的,因此要使用数据模型,需要首先建立一个 Django 应用。使用以下命令:

python manage.py startapp messages

执行成功后,会在项目目录下新建一个名为 comments 的目录,这就是 comments 应用包的路径,startapp 会对它进行初始化。初始化后包含三个文件:

gentoo myblog # ls messages/
__init__.py  models.py  views.py

对这三个文件作一下简要说明:

  • __init__.py:同项目目录下的 __init__.py,表示这是一个包。
  • models.py:模型定义。一会儿我们就需要在这里面定义数据模型。
  • views.py:该应用的视图控制实现代码。

新建的应用在 Django 项目中默认是不启用的,因此我们需要修改 settings.py 来启用我们的留言板应用,同时先禁用其它暂时不用的应用:

INSTALLED_APPS = (
#    ‘django.contrib.auth’,
#    ‘django.contrib.contenttypes’,
#    ‘django.contrib.sessions’,
#    ‘django.contrib.sites’,
    ‘myblog.messages’,
)

在 INSTALLED_APPS 尾部加上 ‘myblog.messages’ 即可。

新建应用后,models.py 和 views.py 都是空的,下一步我们就要对它们进行填充实现。

建立留言板模型

我们要实现的留言板由以下部分组成:

  • 留言者
  • 邮箱
  • 主页
  • 留言标题
  • 留言内容
  • 留言时间
  • 留言者 IP

根据以上描述,在 models.py 中定义它:

from django.db import models

class Message(models.Model):
    name = models.CharField(max_length=30)
    email = models.EmailField()
    homepage = models.URLField()
    title = models.CharField(max_length=200)
    content = models.CharField(max_length=500)
    time = models.DateTimeField(auto_now_add=True)
    ip = models.CharField(max_length=20)

Comment 类继承自 Django 的 models.Model 类,models.CharField、models.DateTimeField 等都是 Django 数据模型中支持的类型,更多可用类型请参考官方手册

安装模型

到这里为止,我们还没有对数据库做任何结构定义操作,在开发应用时习惯先建立数据库和表结构的朋友可能会有点儿迷惑,这些数据表什么时候会被创建?在这一步里,我们就要做这个事情,通过安装模型把模型定义同步到数据库。

首先使用以下命令验证一下模型的有效性:

python manage.py validate

如果提示“0 errors found”,则表示模型被正确定义,否则请返回修改。

在开始安装模型前,你可能需要查看一个安装模型时执行的 SQL 语句,你可以使用以下命令查看:

python manage.py sqlall messages

执行后结果类似:

gentoo myblog # python manage.py sqlall messages
BEGIN;
CREATE TABLE `messages_message` (
    `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
    `name` varchar(30) NOT NULL,
    `email` varchar(75) NOT NULL,
    `homepage` varchar(200) NOT NULL,
    `title` varchar(200) NOT NULL,
    `content` varchar(500) NOT NULL,
    `time` datetime NOT NULL,
    `ip` varchar(20) NOT NULL
)
;
COMMIT;

确认无误后使用以下命令将模型同步到数据库:

python manage.py syncdb

这将会在数据库中建立一个 messages_message 表。

使用数据模型

这一节中,我们暂不打算为留言板创建视图控制,这部分我们将在下一节中实现。但是我们希望先通过一些简单的方法来快速测试一下这个数据模型。

下面我们就通过使用 Python 命令行来测试这个数据模型,如果直接通过输入 python 来启动 shell,那么在导入一些 Django 相关的库时会发生错误,因为缺少相关环境变量的设置。

所以,我们需要使用以下命令启动 Python 命令行:

python manage.py shell

导入数据模型并显示所有留言:

>>> from messages.models import Message
>>> Message.objects.all()
[]

因为当前数据表中并没有存在任何留言记录,所以 Message.objects.all() 显示为空。

新增留言:

>>> m = Message(name=’Hily’,
…        email=’hily@test.com’,
…        homepage=’http://hily.me/’,
…        title=’My first message’,
…        content=’This is my first message.’,
…        ip=’192.168.1.5′)
>>> m.save()
>>> Message.objects.all()                       
[<Message: Message object>]

要使 Message.objects.all() 输出可阅读的信息,我们需要修改 Message 类,增加 __str__ 方法:

from django.db import models

class Message(models.Model):
    name = models.CharField(max_length=30)
    email = models.EmailField()
    homepage = models.URLField()
    title = models.CharField(max_length=200)
    content = models.CharField(max_length=500)
    time = models.DateTimeField(auto_now_add=True)
    ip = models.CharField(max_length=20)

    def __str__(self):
        return ‘Name: %s Email: %s Homepage: %s\n’ \
               ‘Time: %s IP: %s\n’ \
               ‘Title: %s\nContent: %s\n’ \
               % (self.name, self.email, self.homepage,
                  self.time, self.ip,
                  self.title, self.content);

重新启动 shell,查看所有留言记录:

>>> from messages.models import Message
>>> Message.objects.all()
[<Message: Name: Hily Email: hily@test.com Homepage: http://hily.me/
Time: 2008-11-21 09:00:17 IP: 192.168.1.5
Title: My first message
Content: This is my first message.
>]

更新记录:

>>> m = Message.objects.get(name=’Hily’)
>>> m.content = ‘Is this my first message?’
>>> m.save()
>>> Message.objects.all()                 
[<Message: Name: Hily Email: hily@test.com Homepage: http://hily.me/
Time: 2008-11-21 09:00:17 IP: 192.168.1.5
Title: My first message
Content: Is this my first message?
>]

删除记录:

>>> m = Message.objects.get(name=’Hily’)
>>> m.delete()
>>> Message.objects.all()              
[]

Django 的 CRUD 为大家演示到此,更多更丰富的模型操作语句,请参考官方手册

下一节 >>>

Django 快速实战入门(六):表单模型

本节中只是建立了一个留言板模型,还没有给它添加视图控制。在下一节,我们将介绍如何使用 Django 的表单模型来快速制作一个留言页面。

— EOF —

《Django 快速实战入门(五):数据模型》有31个想法

  1. You actually make it appear so easy together with your presentation however I in finding this matter to be really one thing that I feel I might by no means understand. It sort of feels too complex and extremely wide for me. I am taking a look forward in your subsequent put up, I’ll try to get the hold of it!

  2. I do not even know the way moidisys I ended up here, however I assumed this submit was good. I do not know who you are however definitely you’re going to a famous blogger in the event you are not already 😉 Cheers!

  3. I take pleasure in, lead to I found exactly what I used to be looking for. You have ended my four day lengthy hunt! God Bless you man. Have a great day. Bye

  4. First of all I want to say wonderful blog! I had a quick question that I’d like to ask if you do not mind. I was interested to know how you center yourself and clear your head prior to writing. I’ve had difficulty clearing my thoughts in getting my thoughts out there. I do enjoy writing but it just seems like the first 10 to 15 minutes tend to be wasted just trying to figure out how to begin. Any recommendations or tips? Appreciate it!|

  5. Oh, and Snake, let’s not forget Nick Saban coached the Miami Dolphins and couldn’t do squat with them. People still consider him the best coach in the college game.

  6. やあ! クール サイト! 男 .. 美しい .. ワンダフル .. 私がよブックマークあなたのサイトもさらに? |ここで 公開、我々が必要私たちが望む 開発 よりうまくこの中で |この}点に、{ありがとうございます。 。 。 。 。 。
    土日祝も発送 中古 安い http://leopardsandroses.com

  7. この上サイト |スパム問題問題を持っています。私もブロガーだ、と私はあった不思議あなたの状況を、 私たちの多く 作成しているいくつかの素晴らしい実践と我々は見ているの為替と 他の人々興味があれば| 電子メール、電子メール、私は撃つください。
    土日祝も発送 送料無料海外限定 http://cloudchiro.com

  8. こんにちは ブラウザの互換性の問題を持つ可能性があります、私はあなたが考えます。で 私はあなたを見てみると、それが正常に見えるが、Internet Explorerで開くときに、それはいくつかの重複があります。私はちょうどあなたに素早く頭を放棄したかったです!ブログという、素晴らしい素晴らしい凄い [その他!
    2015 新品 土日祝も発送 http://gjlocks.co.uk

    1. This was such a beautiful opportunity, your psalm is on fire! I did mine yesterday. A Psalm of Dee Dee1 The Lord is my everything. 2 The Lord is my refuge. 3 He is my encourager. When I’ve often felt like I was at the end of my rope He showed me how to tie a knot and hold on. 4 He is my provider. When I need financial provision He takes care of it. He sends who needs to be with me, He puts me where I need to be. 5 He is my coverage and my comforter. I may cry, I may hide but, He assures me that no one can break me. 6 He loves me this I know, this I know! What a friend, a doctor, a lawyer, a teacher, a counselor &#gr30;eve2ythin8! Hallelujah!

  9. This is really interesting, You are an excessively professional blogger. I have joined your feed and sit up for searching for extra of your great post. Additionally, I have shared your site in my social networks|

  10. Thanks for your submission. I also believe laptop computers are getting to be more and more popular right now, and now are sometimes the only type of computer utilized in a household. It is because at the same time actually becoming more and more affordable, their computing power is growing to the point where they may be as robust as pc’s coming from just a few years back.

发表评论

电子邮件地址不会被公开。 必填项已用*标注