[Django]编写第一个Django app,第二部分——创建模型和使用模型

转载:http://www.cnblogs.com/reallypride/archive/2008/11/29/1343615.html

创建模型

现在你的运行环境——"project"——已经建好了,现在准备让它开始工作了。

你在Django中写的每一个应用程序都是由Python包组成,它们都在Python的路径下,遵循一定的约定。

Django自带有一个实用的工具,自动生成app的基本目录结构,因些,你可以把更多的精力放在代码的编写上而不是创建目录上。

Projects vs. apps(项目与应用程序)

project和app之间有什么不同之处呢?一个app是实现某种功能的Web 应用程序——例如,一个网络博客系统,一个公共记录的数据库或一个简单的投票程序。一个project是具体网站app和配置的集合。一个project 可以包含多个apps。一个app可以在多个project中。

在本教程中,我们将会在mysite文件夹中简单地创建我们的poll app。因而,这个app属于这个project——mysite,在poll app中的python代码相当于mysite.polls。在本程序后面,我们会讨论发布您的apps时的解耦。

要创建你的app,先要确保你是在mysite文件夹中,然后输入这些命令:

  python manage.py startapp polls

它们将会创建一个polls文件夹,里面的内容是:

  polls/

    __init__.py

    models.py

    views.py

这个目录结构就是app应用程序。

编写数据库Web应用程序的第一步是定义你的模型层——基本上就是你的数据库的布局,但添加了些额外的元数据。

在我们的简单的poll app中,我们将会创建两个模型:polls和choices。poll包含question和publication date。choise有两个字段:选择的文字和投票记分。每个choise都和一个poll关联。

这些概念可以用简单的Python类来描述。把文件polls/models.py编辑成如下面的样子:

  from django.db import models

  class Poll(models.Model):
      question = models.CharField(max_length=200)
      pub_date = models.DateTimeField('date published')

  class Choice(models.Model):
      poll = models.ForeignKey(Poll)
      choice = models.CharField(max_length=200)
      votes = models.IntegerField()

关于max_length的错误

如果Django给你一个错误信息提示max_length不是正确的参数,你很可能使用的是旧版的Django。(本教程是针对Django最新的开发版本写的)(顺便说一下,旧版使用的参数是maxlength)。

这些代码都比较简单直观。每个模型都对应一个类,它是django.db.models.Model的子类。每个模型都包含有一些类级变量,它们代表数据库的字段。

每个字段都是Field类的实例——如,CharField是character字段,DateTimeField是日期字段。这些变量告诉Django字段保存的数据类型。

Field实例名(如question或pub_date)是字段的名字,使用机器友好的格式。你可以在Python代码中使用它们,也可以在数据库中作为列名使用。

你可以使用第一个可选的参数来定义Field的人性化的名字。它在Django中作为提示的内容。如果这个字段没有提供,Django将使用对机器 易读的名字。在这个例子中,我们只为Poll.pub_date定义了人性化的名字。模型中的其它字段都是使用对机器易读,对人不易阅读的名字。

一些Field类需要参数。例如CharField,需要你给出max_length。它不仅是用于数据库的架构信息中,还用于数据验证,等会我们就会看到了。

最后,关注一下关联的定义,使用ForeignKey。它告诉Django每个Choice和一个Poll关联。Django提供有所有常用的数据库关联:多对一,多对多,一对一。

使用模型

这些少量的模型代码给了Django大量的信息。通过它,Django能够做这些事情:

  1.为这个app创建数据库的架构信息(Create TABLE 声明)。

  2.创建Python的数据库访问API来获取Poll和Choice对象。

但首先,我们要告诉我们的project,polls app已经安装好了。

再次编辑settings.py文件,修改INSTALLED_APPS的设置,加入字符吕'mysite.polls'。这样,它的代码看起来如下:

  INSTALLED_APPS = (
      'django.contrib.auth',
      'django.contrib.contenttypes',
      'django.contrib.sessions',
      'django.contrib.sites',
      'mysite.polls'
  )

现在,Django已经知道了mysite中包含有polls app。让我们运行另一个命令:

  python manage.py SQL polls

你应该会看到一些类似于下面的信息(polls app的Create TABLE SQL描述语句)

BEGIN;
Create TABLE "polls_poll" (
    "id" serial NOT NULL PRIMARY KEY,
    "question" varchar(200) NOT NULL,
    "pub_date" timestamp with time zone NOT NULL
);
Create TABLE "polls_choice" (
    "id" serial NOT NULL PRIMARY KEY,
    "poll_id" integer NOT NULL REFERENCES "polls_poll" ("id"),
    "choice" varchar(200) NOT NULL,
    "votes" integer NOT NULL
);
COMMIT;

注意以下各项:

  1.这些输出依赖于你所使用的数据库。

  2.表名是自动生成的,由app(polls)名和模型名的小写组成——poll和choice。(你可以重写这个行为)

  3.主键(IDs)是自动添加的。(这个你也可以重写)

  4.为了方便,Django在外键字段名后面加上"_id"。你也可以重写这个。

  5.外键关系使用显式的REFERENCES声明。

  6.它根据你使用的数据库做不同的调整,因些一些特殊的字段类型,如auto_increment(MySQL),serial(PostgreSQL),或integer primary key(SQLite)

     都会为你自动处理。相同地,对于引号也是如此。——如,使用单引号或双引号。本教程的作者使用的是PostgreSQL,因此例子中输出的是使用

   PostgreSQL的语法。

  7.这些sql命令并不是运行在数据库的实际的SQL,它只是打印在屏幕上,因些你能看到Django认为需要使用什么SQL语句。如果你愿意,你可以copy

     并粘贴这些SQL到你的数据库提示框中。然而,很快你就会看到,Django提供了更简单的方法来向数据库执行这些SQL语句。

如果你有兴趣,你还可以运行下面的命令:

  1.python manage.py validate —— 检查模型的结构上是否有错误。

  2.python manage.py sqlcustom polls —— 输出所有在应用程序中定义的自定义SQL描述(如表的限制或约束)。

  3.python manage.py sqlclear polls —— 输出在这个app中删除已存在的表的Drop TABLE描述。

  4.python manage.py sqlall polls —— 一个组合所有的sql,sqlcustom和sqlindexes的SQL命令.

从这些输出的命令中能帮助我们了解在自动生成引擎下实际做了些什么事情。

现在,再次运行syncdb在你的数据库中创建这些模型的表。

  python manage.py syncdb

syncdb命令在你的数据库中运行从'sqlall'中得来的sql命令,它只运行在INSATLLED_APPS中,还没有保存存在你的数据库中的apps。

它创建所有的表,初始化数据和索引你最后一次运行syncdb时你已经添加到你的工程中的apps。syncdb你想运行多少次都可以,

它只创建还没有存在的表。

 

因为第一次翻译英文资料,计算机术语了解得不多,英语水平也不行,翻译得不够准确的地方还请多多包涵。

赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏