编写你的第一个Django应用程序2 本教程上接教程1,将设置数据库,创建你的第一个模型,并快速介绍Django自动生成的管理后台站点。

它是一个用模块级别变量来表示 Django 配置的普通 Python 模块。

然而,当你开始第一个真正的项目时,可能希望使用更可扩展的数据库(如PostgreSQL),以避免后面令人头疼的数据库切换。

'default'条目中以下的键以匹配你的数据库连接设置:

  • 也是可以的
  • 'db.sqlite3'),它将文件保存在你项目的目录中。

数据库的参考文档。

对于SQLite以外的数据库

database_name;”创建它。

测试数据库,这将在稍后的教程中需要。

如果你使用SQLite,你不需要事先创建任何东西 —— 数据库文件将会在需要的时候自动创建。

TIME_ZONE为你自己的时区。

应用可以在多个项目中使用,而且你可以将这些应用打包和分发给其他人在他们的项目中使用。

INSTALLED_APPS包含下面的应用,它们都是Django 与生俱来的:

这些应用,默认包含在Django中,以方便通用场合下使用。

要做到这一点,请运行以下命令:

$ python manage.py migrate

USER_TABLES; (Oracle)

对于极简主义者来说

INSTALLED_APPS中的应用运行数据库的迁移。

现在,我们将使用额外的元数据来定义你的模型 — 主要是数据库的布局。

理念

这个原则的目标是在一个地方定义你的数据模型,并自动从它获得需要的信息。

迁移工具也符合以上哲学 —— 这不同于Ruby On Rails中的迁移;例如,迁移完全依照于你的模型文件且本质上只是一个历史记录,Django通过这个历史记录更新你的数据库模式使它与你现在的模型文件保持一致。

Question关联。

polls/models.py文件,并让它看起来像这样:

polls/ models.py
models


):
    )
    )


):
    )
    )
    )

每个模型都有一些类变量,在模型中每个类变量都代表了数据库中的一个字段。

这种方法告诉Django,每个字段中保存着什么类型的数据。

你将在Python代码中使用到它的值,并且你的数据库将把它用作表的列名。

对于这个模型中其他的字段,机器可读的名字(实例名)足以充分地表达出它的含义。

这个参数不仅用于数据库模式,而且数据验证中也会用到,我们稍后会看到。

default)为0。

Django支持所有常见的数据库关系:多对一,多对多和一一对应。

有了这些代码,Django就能够自动完成以下两个功能:

  • TABLE 语句)。
  • Choice对象创建一个访问数据库的python API。

polls应用已经安装。

理念

Django 应用是可以“热插即可以在多个项目中使用同一个应用,也可以分发这些应用, 因为它们不需要与某个特定的Django安装绑定。

看起来像这样:

mysite/settings.py
[
    'polls.apps.PollsConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

让我们运行另外一个命令:

$ python manage.py makemigrations polls

你应该看到类似下面的内容:

Migrations for 'polls':
  polls/migrations/0001_initial.py:
    - Create model Choice
    - Create model Question
    - Add field question to choice

makemigrations告诉Django,已经对模型做了一些更改(在这个例子中,你创建了一个新的模型)并且会将这些更改记录为迁移文件

不用担心,Django不要求你在每次Django生成迁移文件之后都要阅读这些文件,但是它们被设计成可人为编辑的形式,以便你可以手工稍微修改一下Django的某些具体行为。

sqlmigrate命令接收迁移文件的名字并返回它们的SQL语句:

0001

你应该会看到类似如下的内容(为了便于阅读我们对它重新编排了格式):

;
--
-- Create model Choice
--
CREATE TABLE "polls_choice" (
    "id" serial NOT NULL PRIMARY KEY,
    "choice_text" varchar(200) NOT NULL,
    "votes" integer NOT NULL
);
--
-- Create model Question
--
CREATE TABLE "polls_question" (
    "id" serial NOT NULL PRIMARY KEY,
    "question_text" varchar(200) NOT NULL,
    "pub_date" timestamp with time zone NOT NULL
);
--
-- Add field question to choice
--
ALTER TABLE "polls_choice" ADD COLUMN "question_id" integer NOT NULL;
ALTER TABLE "polls_choice" ALTER COLUMN "question_id" DROP DEFAULT;
CREATE INDEX "polls_choice_7aa0f6ee" ON "polls_choice" ("question_id");
ALTER TABLE "polls_choice"
  ADD CONSTRAINT "polls_choice_question_id_246c99a640fbbd72_fk_polls_question_id"
    FOREIGN KEY ("question_id")
    REFERENCES "polls_question" ("id")
    DEFERRABLE INITIALLY DEFERRED;

COMMIT;

请注意以下几点:

  • 以上例子使用的数据库是PostgreSQL。
  • (你可以重写这个行为。)
  • (你也可以重写这个行为。)
  • (是的,你也可以重写这个。)
  • DEFERRABLE部分;这只是告诉PostgreSQL不执行外键直到事务结束。
  • 引用字段名称也是如此,例如使用双引号或单引号。
  • 这对于检查Django将要进行的数据库操作或者你的数据库管理员需要这些SQL脚本是非常有用的。

check;这将检查项目中的任何问题,而不进行迁移和访问数据库。

migrate以在你的数据库中创建模型所对应的表:

$ python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, polls, sessions
Running migrations:
  DONE
  Applying polls.0001_initial... OK

django_migrations的特殊表来追踪哪些迁移文件已经被应用过),并且在你的数据库上运行它们 —— 本质上来讲,就是使你的数据库模式和你改动后的模型进行同步。

我们将在本教程的后续章节对迁移进行深入地讲解,但是现在,请记住实现模型变更的三个步骤:

  • models.py文件中)。
  • makemigrations ,为这些修改创建迁移文件
  • migrate ,将这些改变更新到数据库中。

有单独的命令来制作和应用迁移的原因是因为您将提交迁移到您的版本控制系统并将其发送到您的应用程序;它们不仅可以使您的开发更容易,而且还可以被其他开发人员和生产中使用。

manage.py 工具能做的所有事情。

使用如下命令来调用Python shell:

$ python manage.py shell

mysite/settings.py文件的路径。

绕开 manage.py

mysite.settings,启动一个普通的Python shell,然后建立Django:

django
()

你需要换一个合适的Django版本

mysite能运行。

django-admin 文案。

database API:

# Import the model classes we just wrote.(导入我们刚刚编写的那些模型类)

# No questions are in the system yet.(系统中还没有question。)
()
<QuerySet []>

# Create a new Question.(创建一个新的Question。)
# 默认的settings文件中启用对时区的支持,所以
使用timezone.now()
# 而不是datetime.datetime.now(),它将完成正确的事情。
timezone
())

你必须显示地调用save()。
()


这不是什么事;它只是表示你的
# 数据库后端返回的是Python长整形
# 对象。
id
1

# 通过Python属性访问模型字段的值。
question_text

pub_date
datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=<UTC>)

# 通过改变属性来改变字段的值,然后调用save()。

()

# objects.all()显示数据库中所有的question。
()
<QuerySet [<Question: Question object>]>

Choice

polls/models.py
models
python_2_unicode_compatible

# 如果你需要支持Python 2
):
    # ...
    ):
        question_text

# 如果你需要支持Python 2
):
    # ...
    ):
        choice_text

__str__()方法很重要,不仅会使你自己在使用交互式命令行时看得更加方便,而且会在Django自动生成的管理界面中使用对象的这种表示。

让我们演示一下如何添加一个自定义的方法:

polls/models.py
datetime

models
timezone


):
    # ...
    ):
        )

时区支持文档 中了解更多的知识。

shell再次打开一个新的Python 交互式shell:

Choice

# 确认我们的 __str__()方法 正常工作.
()
<QuerySet [<Question: What's up?>]>

# Django 提供了丰富的数据库查询 API 通过
# 关键字参数来驱动
)
<QuerySet [<Question: What's up?>]>
)
<QuerySet [<Question: What's up?>]>

# 获取今年发布的问题
timezone
year
)
<Question: What's up?>

# 请求ID不存在,这将会引发一个异常.
)
Traceback (most recent call last):
    ...
Question matching query does not exist.

# 通过主键查询数据是常见的情况,因此 Django 提供了精确查找主键的快捷方式。
# (与上句合并)
# 以下内容与 Question.objects.get(id = 1)相同。
)
<Question: What's up?>

# 确认我们的自定义方法正常工作.
)
()
True

创建一个新的
# Choice 对象, 使用 INSERT 语句将选项添加到可用选项的集合并返回新的“Choice”对象。
Django 创建
# 一个集合来控制通过外键关联的“另一端”。
# (例如,一个“问题”的“选项”)
)

# 显示任何有关的选项 ——目前还没有.
()
<QuerySet []>

# 创建三个choices。
)
<Choice: Not much>
)
<Choice: The sky>
)

# Choice 对象通过 API 访问与之关联的 Question 对象.
question
<Question: What's up?>

# 反之亦然:Question对象可以访问Choice对象。
()
<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>
()
3

# AIP 根据需要自动创建关系。
# 可以使用双下划线分隔关系。
# 它的工作机制是尽可能深的创建关系,而没有限制。
# 通过 pub_date 查找今年内创建的问题的所有选项
# (再次使用了之前创建的 'current_year' 变量).
)
<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>

使用 delete() 方法.
)
()

数据库API参考

理念

为此,Django会根据你写的模型文件完全自动地生成管理后台界面。

Django解决了这个问题,为网站管理者创建统一的管理后台界面用以编辑内容。

它用于网站的管理员。

运行如下命令:

$ python manage.py createsuperuser

键入你想要使用的用户名,然后按下回车键:

Username: admin

然后提示你输入想要使用的邮件地址:

Email address: admin@example.com

你需要输入两次密码,第二次输入是确认密码

Password: **********
Password (again): *********
Superuser created successfully.

让我们启动开发服务器,然后探索它。

如果服务器没有运行,像下面这样启动它:

$ python manage.py runserver

你应该会看到管理后台站点的登录界面:

编写你的第一个Django应用程序2
本教程上接教程1,将设置数据库,创建你的第一个模型,并快速介绍Django自动生成的管理后台站点。

翻译,因此登录屏幕可能会以你自己的语言显示,具体取决于浏览器的设置和Django是否有该语言的翻译。

你应该会看到Django管理后台站点的首页面:

编写你的第一个Django应用程序2
本教程上接教程1,将设置数据库,创建你的第一个模型,并快速介绍Django自动生成的管理后台站点。

django.contrib.auth提供的,这个认证框架集成在Django中。

它没有显示在管理后台站点的首页面上。

polls/admin.py文件,把它编辑成这样:

polls/admin.py
admin

Question

)

Question对象,Django应该把它显示在管理站点的首页面上:

编写你的第一个Django应用程序2
本教程上接教程1,将设置数据库,创建你的第一个模型,并快速介绍Django自动生成的管理后台站点。

我们之前创建的“What's up?”问题

编写你的第一个Django应用程序2
本教程上接教程1,将设置数据库,创建你的第一个模型,并快速介绍Django自动生成的管理后台站点。

单击“What’s up?”来编辑它:

编写你的第一个Django应用程序2
本教程上接教程1,将设置数据库,创建你的第一个模型,并快速介绍Django自动生成的管理后台站点。

注意事项:

  • Question模型文件自动生成的。
  • 每一种类型的字段,Django管理站点都知道如何显示它们。
  • Date有个“Today”的快捷方式和一个弹出式日历,time栏有个“Now”的快捷方式和一个列出常用时间选项的弹出式窗口。

界面的底部有几个按钮:

  • Save — 保存更改,并返回当前类型对象的变更列表页面。
  • Save and continue editing — 保存更改并且重新载入当前对象的管理界面。
  • Save and add another — 保存更改并且载入一个当前类型对象的新的、空白的表单。
  • Delete — 显示一个删除确认界面。

修改它,然后重新载入这个界面,检查一下正确的值是否出现。

你将看到一个页面,列出了通过Django管理界面对此对象所做的全部更改的清单,包含有时间戳和修改人的姓名等信息:

编写你的第一个Django应用程序2
本教程上接教程1,将设置数据库,创建你的第一个模型,并快速介绍Django自动生成的管理后台站点。

本教程的第三部分学习如何添加更多的视图到我们的投票应用中。