• 模型安装

    模型安装

    完成这些代码之后,现在让我们来在数据库中创建这些表。 要完成该项工作,第一步是在 Django 项目中 激活 这些模型。 将 books app 添加到配置文件的已安装应用列表中即可完成此步骤。

    再次编辑 settings.py 文件, 找到 INSTALLED_APPS 设置。 INSTALLED_APPS 告诉 Django 项目哪些 app 处于激活状态。 缺省情况下如下所示:

    1. INSTALLED_APPS = (
    2. 'django.contrib.auth',
    3. 'django.contrib.contenttypes',
    4. 'django.contrib.sessions',
    5. 'django.contrib.sites',
    6. )

    把这四个设置前面加#临时注释起来。 (这四个app是经常使用到的,我们将在后续章节里讨论如何使用它们)。同时,注释掉MIDDLEWARE_CLASSES的默认设置条目,因为这些条目是依赖于刚才我们刚在INSTALLED_APPS注释掉的apps。 然后,添加‘mysite.books’INSTALLED_APPS 的末尾,此时设置的内容看起来应该是这样的:

    1. MIDDLEWARE_CLASSES = (
    2. # 'django.middleware.common.CommonMiddleware',
    3. # 'django.contrib.sessions.middleware.SessionMiddleware',
    4. # 'django.contrib.auth.middleware.AuthenticationMiddleware',
    5. )
    6. INSTALLED_APPS = (
    7. # 'django.contrib.auth',
    8. # 'django.contrib.contenttypes',
    9. # 'django.contrib.sessions',
    10. # 'django.contrib.sites',
    11. 'mysite.books',
    12. )

    (就像我们在上一章设置TEMPLATEDIRS所提到的逗号,同样在INSTALLED_APPS的末尾也需添加一个逗号,因为这是个单元素的元组。 另外,本书的作者喜欢在 每一个_ tuple元素后面加一个逗号,不管它是不是 只有一个元素。 这是为了避免忘了加逗号,而且也没什么坏处。)

    'mysite.books'指示我们正在编写的books app。 INSTALLED_APPS 中的每个app都使用 Python的路径描述,包的路径,用小数点“.”间隔。

    现在我们可以创建数据库表了。 首先,用下面的命令验证模型的有效性:

    1. python manage.py validate

    validate 命令检查你的模型的语法和逻辑是否正确。 如果一切正常,你会看到 0 errors found 消息。如果出错,请检查你输入的模型代码。 错误输出会给出非常有用的错误信息来帮助你修正你的模型。

    一旦你觉得你的模型可能有问题,运行 python manage.py validate 。 它可以帮助你捕获一些常见的模型定义错误。

    模型确认没问题了,运行下面的命令来生成 CREATE TABLE 语句(如果你使用的是Unix,那么可以启用语法高亮):

    1. python manage.py sqlall books

    在这个命令行中, books 是app的名称。 和你运行 manage.py startapp 中的一样。执行之后,输出如下:

    1. BEGIN;
    2. CREATE TABLE "books_publisher" (
    3. "id" serial NOT NULL PRIMARY KEY,
    4. "name" varchar(30) NOT NULL,
    5. "address" varchar(50) NOT NULL,
    6. "city" varchar(60) NOT NULL,
    7. "state_province" varchar(30) NOT NULL,
    8. "country" varchar(50) NOT NULL,
    9. "website" varchar(200) NOT NULL
    10. )
    11. ;
    12. CREATE TABLE "books_author" (
    13. "id" serial NOT NULL PRIMARY KEY,
    14. "first_name" varchar(30) NOT NULL,
    15. "last_name" varchar(40) NOT NULL,
    16. "email" varchar(75) NOT NULL
    17. )
    18. ;
    19. CREATE TABLE "books_book" (
    20. "id" serial NOT NULL PRIMARY KEY,
    21. "title" varchar(100) NOT NULL,
    22. "publisher_id" integer NOT NULL REFERENCES "books_publisher" ("id") DEFERRABLE INITIALLY DEFERRED,
    23. "publication_date" date NOT NULL
    24. )
    25. ;
    26. CREATE TABLE "books_book_authors" (
    27. "id" serial NOT NULL PRIMARY KEY,
    28. "book_id" integer NOT NULL REFERENCES "books_book" ("id") DEFERRABLE INITIALLY DEFERRED,
    29. "author_id" integer NOT NULL REFERENCES "books_author" ("id") DEFERRABLE INITIALLY DEFERRED,
    30. UNIQUE ("book_id", "author_id")
    31. )
    32. ;
    33. CREATE INDEX "books_book_publisher_id" ON "books_book" ("publisher_id");
    34. COMMIT;

    注意:

    • 自动生成的表名是app名称( books )和模型的小写名称 ( publisher , book , author )的组合。你可以参考附录B重写这个规则。

    • 我们前面已经提到,Django为每个表格自动添加加了一个 id 主键, 你可以重新设置它。

    • 按约定,Django添加 "_id" 后缀到外键字段名。 你猜对了,这个同样是可以自定义的。

    • 外键是用 REFERENCES 语句明确定义的。

    • 这些 CREATE TABLE 语句会根据你的数据库而作调整,这样象数据库特定的一些字段例如:(MySQL),auto_increment(PostgreSQL),serial(SQLite),都会自动生成。integer primary key 同样的,字段名称也是自动处理(例如单引号还好是双引号)。 例子中的输出是基于PostgreSQL语法的。

    sqlall 命令并没有在数据库中真正创建数据表,只是把SQL语句段打印出来,这样你可以看到Django究竟会做些什么。 如果你想这么做的话,你可以把那些SQL语句复制到你的数据库客户端执行,或者通过Unix管道直接进行操作(例如,python manager.py sqlall books | psql mydb )。不过,Django提供了一种更为简易的提交SQL语句至数据库的方法: syncdb 命令

    1. python manage.py syncdb

    执行这个命令后,将看到类似以下的内容:

    1. Creating table books_publisher
    2. Creating table books_author
    3. Creating table books_book
    4. Installing index for books.Book model

    syncdb 命令是同步你的模型到数据库的一个简单方法。 它会根据 INSTALLEDAPPS 里设置的app来检查数据库, 如果表不存在,它就会创建它。 需要注意的是, syncdb不能_将模型的修改或删除同步到数据库;如果你修改或删除了一个模型,并想把它提交到数据库,syncdb并不会做出任何处理。 (更多内容请查看本章最后的“修改数据库的架构”一段。)

    如果你再次运行 python manage.py syncdb ,什么也没发生,因为你没有添加新的模型或者 添加新的app。因此,运行python manage.py syncdb总是安全的,因为它不会重复执行SQL语句。

    如果你有兴趣,花点时间用你的SQL客户端登录进数据库服务器看看刚才Django创建的数据表。 你可以手动启动命令行客户端(例如,执行PostgreSQL的psql 命令),也可以执行 python manage.py dbshell ,这个命令将依据DATABASE_SERVER 的里设置自动检测使用哪种命令行客户端。 常言说,后来者居上。