接着上次第1部分开始,现在我们将设置数据库,创建您的第一个模型,并快速获得 介绍 Django 自动生成的管理站点。

一、数据库设置

现在,打开.这是一个普通的 Python 模块,具有 表示 Django 设置的模块级变量。mysite/settings.py

默认情况下,配置使用 SQLite。如果您不熟悉数据库,或者 你只是对尝试 Django 感兴趣,这是最简单的选择。SQLite 是 包含在 Python 中,因此您无需安装任何其他内容来支持您的 数据库。但是,在开始您的第一个实际项目时,您可能希望使用 更具可扩展性的数据库,如PostgreSQL,以避免数据库切换难题 在路上。

如果要使用其他数据库,请安装相应的数据库 绑定并更改“数据库”项中的以下键以匹配数据库连接 设置:'default'

  • ENGINE– 如:'django.db.backends.sqlite3','django.db.backends.postgresql','django.db.backends.mysql','django.db.backends.oracle'
  • NAME – 数据库的名称。如果您使用的是 SQLite,则 数据库将是计算机上的文件;在这种情况下,NAME 应该是该文件的完整绝对路径,包括文件名。这 默认值 , 会将文件存储在您的 项目目录。BASE_DIR / 'db.sqlite3'

如果不使用 SQLite 作为数据库,则必须添加其他设置,如 USERPASSWORD 和 HOST。 有关更多详细信息,请参阅数据库的参考文档。

参考我的数据库配置:

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'world',
"USER": "root",
"PASSWORD": "123456",
"HOST": "127.0.0.1",
"PORT": "3306",
"OPTIONS": {"init_command": "SET default_storage_engine=INNODB",}, }
}

二、创建模型

现在我们将定义您的模型 - 本质上是您的数据库布局,使用 其他元数据。

在我们的投票应用程序中,我们将创建两个模型:Question 有问题和发布日期 两个字段。Choice 有两个字段:选择的文本和投票数。每个Choice 都关联 一个Question 。

这些概念由 Python 类表示。编辑文件,使其如下所示:polls/models.py

from django.db import models

class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField("date published") class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)

在这里,每个模型都由一个类表示,该类对django.db.models.Model进行了子类。每个模型都有许多类变量, 每个字段都表示模型中的一个数据库字段。

每个字段都由 Field 类的一个实例表示 - 例如,字符字段的 CharField 和日期时间的 DateTimeField。这告诉 Django 什么 每个字段包含的数据类型。

每个字段实例的名称(例如 或 ) 是字段的名称,机器友好 格式。您将在 Python 代码中使用此值,您的数据库将使用 它作为列名。(question_text or pub_date)

您可以使用可选的 Field 第一个位置参数来指定人类可读的名称。那是用的 在 Django 的几个内省部分中,它兼作文档。 如果未提供此字段,Django 将使用机器可读的名称。在此 例如,我们只为 定义了一个人类可读的名称。 对于此模型中的所有其他字段,字段的机器可读名称将 作为其人类可读的名称就足够了。Question.pub_date

某些字段类具有必需的参数。例如,CharField要求你给它一个max_length。这不仅用于 数据库架构,但在验证中,我们很快就会看到。

字段还可以具有各种可选参数;在 在本例中,我们将votes默认值设置为 0。

最后,请注意使用外键定义了关系。这告诉 Django 每个都是 与单个 .Django 支持所有通用数据库 关系:多对一、多对多和一对一。每个Choice 都关联 一个Question 。

三、激活模型

这一小部分模型代码为 Django 提供了大量信息。有了它,Django 能够:

  • 为此应用创建数据库架构(语句)。CREATE TABLE
  • 创建用于访问和Question 和 Choice对象的 Python 数据库访问 API。

但首先我们需要告诉我们的项目已安装该polls应用程序。

要将应用程序包含在我们的项目中,我们需要编辑 mysite/settings.py 文件,添加对其的引用 INSTALLED_APPS设置中的配置类。

将 'polls.apps.PollsConfig' 添加到INSTALLED_APPS设置。如下:

INSTALLED_APPS = [
"polls.apps.PollsConfig", #添加的
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
]

现在Django知道包含该polls应用程序。让我们运行另一个命令(记得进入 manage.py 所在目录):

$ python manage.py makemigrations polls

您应该看到类似于以下内容的内容:

Migrations for 'polls':
polls/migrations/0001_initial.py
- Create model Question
- Create model Choice

通过运行makemigrations,你告诉Django你已经做了 对模型进行了一些更改(在本例中,您进行了新的更改),并且 您希望将更改存储为迁移

迁移是 Django 存储对模型的更改的方式(因此也是你的 数据库架构) - 它们是磁盘上的文件。您可以阅读迁移 如果您愿意,可以采用新模型;是文件polls/migrations/0001_initial.py. 别担心,你不需要每次 Django 制作时都阅读它们,但是 它们被设计为可由人类编辑,以防您想手动调整 Django改变了事情。

有一个命令将为您运行迁移并管理您的数据库 架构自动 - 这称为迁移,我们将在 时刻 - 但首先,让我们看看迁移将运行什么 SQL。sqlmigrate 命令采用迁移名称并返回其 SQL:

$ python manage.py sqlmigrate polls 0001

您应该看到类似于以下内容的内容(我们已将其重新格式化为 可读性):

BEGIN;
--
-- Create model Question
--
CREATE TABLE "polls_question" (
"id" bigint NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
"question_text" varchar(200) NOT NULL,
"pub_date" timestamp with time zone NOT NULL
);
--
-- Create model Choice
--
CREATE TABLE "polls_choice" (
"id" bigint NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
"choice_text" varchar(200) NOT NULL,
"votes" integer NOT NULL,
"question_id" bigint NOT NULL
);
ALTER TABLE "polls_choice"
ADD CONSTRAINT "polls_choice_question_id_c5b4b260_fk_polls_question_id"
FOREIGN KEY ("question_id")
REFERENCES "polls_question" ("id")
DEFERRABLE INITIALLY DEFERRED;
CREATE INDEX "polls_choice_question_id_c5b4b260" ON "polls_choice" ("question_id"); COMMIT;

请注意以下几点:

  • 确切的输出将根据您使用的数据库而有所不同。这 上面的例子是为PostgreSQL生成的。
  • 通过组合应用名称自动生成表名称 () 和模型的小写名称 – 和 .(您可以覆盖此行为。pollsquestionchoice
  • 主键 (ID) 会自动添加。(您也可以覆盖此设置。
  • 按照惯例,Django 会附加到外键字段名称。 (是的,您也可以覆盖它。"_id"
  • 外键关系由约束显式。不要担心零件;这很能说明问题 PostgreSQL 在事务结束之前不强制执行外键。FOREIGN KEYDEFERRABLE
  • 它是针对您正在使用的数据库量身定制的,因此特定于数据库的字段类型 例如(MySQL),(PostgreSQL)或(SQLite) 会自动为您处理。引用字段名称也是如此 – 例如,使用双引号或单引号。auto_incrementbigint PRIMARY KEY GENERATED BY DEFAULT AS IDENTITYinteger primary key autoincrement
  • sqlmigrate 命令实际上不会在 数据库 - 相反,它会将其打印到屏幕上,以便您可以看到什么 SQL Django认为是必需的。它对于检查 Django 将要做什么很有用 执行,或者如果您有需要 SQL 脚本的数据库管理员 变化。

如果你有兴趣,你也可以运行python manage.py 检查;这将检查 您的项目,无需进行迁移或接触数据库。

现在,再次运行 migrate 以在数据库中创建这些模型表:

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

迁移命令将执行所有尚未进行的迁移 应用(Django 使用您的特殊表跟踪哪些应用了 数据库称为 ) 并针对您的数据库运行它们 - 实质上,将您对模型所做的更改与架构同步 在数据库中。django_migrations

迁移功能非常强大,可让您随时间更改模型,因为 开发您的项目,而无需删除您的数据库或表,以及 制作新的 - 它专门实时升级您的数据库,无需 丢失数据。我们将在本教程的后面部分更深入地介绍它们, 但现在,请记住进行模型更改的三步指南:

有单独的命令进行和应用迁移的原因是 因为您将向版本控制系统提交迁移并交付它们 与您的应用程序一起使用;它们不仅使您的开发更容易,而且还 可供其他开发人员和生产环境使用。

阅读 django 管理员文档了解完整内容 有关manage.py实用程序可以执行的操作的信息。

四、使用接口

现在,让我们跳入交互式 Python shell,并使用免费的 API Django 给你。要调用 Python shell,请使用以下命令:

$ python manage.py shell

我们使用它而不是简单地键入“python”,因为设置DJANGO_SETTINGS_MODULE环境变量,这给出了 Django 文件的 Python 导入路径到 manage.pymysite/settings.py

进入 shell 后,请浏览数据库 API

>>> from polls.models import Choice, Question  # Import the model classes we just wrote.

# No questions are in the system yet.
>>> Question.objects.all()
<QuerySet []> # Create a new Question.
# Support for time zones is enabled in the default settings file, so
# Django expects a datetime with tzinfo for pub_date. Use timezone.now()
# instead of datetime.datetime.now() and it will do the right thing.
>>> from django.utils import timezone
>>> q = Question(question_text="What's new?", pub_date=timezone.now()) # Save the object into the database. You have to call save() explicitly.
>>> q.save() # Now it has an ID.
>>> q.id
1 # Access model field values via Python attributes.
>>> q.question_text
"What's new?"
>>> q.pub_date
datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=datetime.timezone.utc) # Change values by changing the attributes, then calling save().
>>> q.question_text = "What's up?"
>>> q.save() # objects.all() displays all the questions in the database.
>>> Question.objects.all()
<QuerySet [<Question: Question object (1)>]>

<Question: Question object (1)> 看不懂对象数据. 修改polls/models.py文件,对 Question and Choice 2个对象模型,都添加1个方法 __str__():
from django.db import models

class Question(models.Model):
# ...
def __str__(self):
return self.question_text class Choice(models.Model):
# ...
def __str__(self):
return self.choice_text

将 __str__() 方法添加到您的 模型,不仅是为了您自己在处理交互时方便 提示,但也因为对象的表示在整个 Django 中使用 自动生成的管理员。

让我们也向这个模型添加一个自定义方法:

import datetime

from django.db import models
from django.utils import timezone class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField("date published") def __str__(self):
return self.question_text #自定义方法
def was_published_recently(self):
return self.pub_date >= ( timezone.now() - datetime.timedelta(days=1) ) class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0) def __str__(self):
return self.choice_text

保存这些更改,然后通过再次运行来启动新的 Python 交互式 shell:python manage.py shell

>>> from polls.models import Choice, Question

# Make sure our __str__() addition worked.
>>> Question.objects.all()
<QuerySet [<Question: What's up?>]> # Django provides a rich database lookup API that's entirely driven by
# keyword arguments.
>>> Question.objects.filter(id=1)
<QuerySet [<Question: What's up?>]>
>>> Question.objects.filter(question_text__startswith="What")
<QuerySet [<Question: What's up?>]> # Get the question that was published this year.
>>> from django.utils import timezone
>>> current_year = timezone.now().year
>>> Question.objects.get(pub_date__year=current_year)
<Question: What's up?> # Request an ID that doesn't exist, this will raise an exception.
>>> Question.objects.get(id=2)
Traceback (most recent call last):
...
DoesNotExist: Question matching query does not exist. # Lookup by a primary key is the most common case, so Django provides a
# shortcut for primary-key exact lookups.
# The following is identical to Question.objects.get(id=1).
>>> Question.objects.get(pk=1)
<Question: What's up?> # Make sure our custom method worked.
>>> q = Question.objects.get(pk=1)
>>> q.was_published_recently()
True # Give the Question a couple of Choices. The create call constructs a new
# Choice object, does the INSERT statement, adds the choice to the set
# of available choices and returns the new Choice object. Django creates
# a set to hold the "other side" of a ForeignKey relation
# (e.g. a question's choice) which can be accessed via the API.
>>> q = Question.objects.get(pk=1) # Display any choices from the related object set -- none so far.
>>> q.choice_set.all()
<QuerySet []> # Create three choices.
>>> q.choice_set.create(choice_text="Not much", votes=0)
<Choice: Not much>
>>> q.choice_set.create(choice_text="The sky", votes=0)
<Choice: The sky>
>>> c = q.choice_set.create(choice_text="Just hacking again", votes=0) # Choice objects have API access to their related Question objects.
>>> c.question
<Question: What's up?> # And vice versa: Question objects get access to Choice objects.
>>> q.choice_set.all()
<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>
>>> q.choice_set.count()
3 # The API automatically follows relationships as far as you need.
# Use double underscores to separate relationships.
# This works as many levels deep as you want; there's no limit.
# Find all Choices for any question whose pub_date is in this year
# (reusing the 'current_year' variable we created above).
>>> Choice.objects.filter(question__pub_date__year=current_year)
<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]> # Let's delete one of the choices. Use delete() for that.
>>> c = q.choice_set.filter(choice_text__startswith="Just hacking")
>>> c.delete()

有关模型关系的详细信息,请参阅访问相关对象。有关如何使用双下划线执行的更多信息 通过 API 进行字段查找,请参阅字段查找。为 有关数据库 API 的完整详细信息,请参阅我们的数据库 API 参考

五、介绍 Django 管理员

生成管理网站,供员工或客户添加、更改和删除 内容是乏味的工作,不需要太多的创造力。为此 原因,Django 完全自动化地为模型创建管理界面。

Django 是在新闻编辑室环境中编写的,有非常明确的分离 在“内容发布者”和“公共”网站之间。站点管理员使用 系统添加新闻报道,事件,体育比分等,该内容是 显示在公共网站上。Django 解决了创建 供站点管理员编辑内容的统一界面。

管理员不应供网站访问者使用。这是为了网站管理。

1、创建管理员用户

首先,我们需要创建一个可以登录到管理站点的用户。运行 以下命令:

$ python manage.py createsuperuser

输入您想要的用户名,然后按回车键。

Username: admin

然后,系统将提示您输入所需的电子邮件地址:

Email address: admin@example.com

最后一步是输入您的密码。您将被要求输入您的 密码两次,第二次作为第一次的确认。

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

2、启动开发服务器

默认情况下,Django 管理站点处于激活状态。让我们开始开发 服务器并探索它。

如果服务器未运行,请像这样启动它:

$ python manage.py runserver

现在,打开网络浏览器并转到“/admin/”本地域上的 - 例如,http://127.0.0.1:8000/admin/。您应该会看到管理员的登录屏幕:

由于翻译默认处于打开状态,因此如果 您设置LANGUAGE_CODE,登录屏幕将显示在 给定语言(如果 Django 有适当的翻译)。

3、进入管理站点

现在,尝试使用您在上一步中创建的超级用户帐户登录。 你应该看到 Django 管理员索引页面:

您应该会看到几种类型的可编辑内容:组和用户。他们是 由 Django.contrib.auth 提供,身份验证框架已交付 由Django 。

4、使投票应用可在后台修改

但是我们的投票应用程序在哪里?它不会显示在管理索引页面上。

只有一件事要做:我们需要告诉管理员对象 具有管理界面。为此,请打开Questionpolls/admin.py文件,然后 编辑它,使其如下所示:

from django.contrib import admin

from .models import Question

admin.site.register(Question)

5、探索免费管理功能

现在我们已经注册了Question,Django 知道它应该显示在 “管理索引”页:

点击“问题”。现在,您进入了问题的“更改列表”页面。本页 显示数据库中的所有问题,并允许您选择一个问题进行更改。 我们之前创建了一个“What’s up?”的问题:

单击“What’s up?”问题进行编辑:

这里需要注意的事项:

  • 窗体是从模型自动生成的。Question
  • 不同的模型字段类型(日期时间字段、字符字段)对应于相应的 HTML 输入小部件。每种类型的字段都知道如何在 Django 中显示自己 管理。
  • 每个日期时间字段都获得免费的JavaScript 快捷方式。日期会显示“今天”快捷方式和日历弹出窗口,时间会显示 “现在”快捷方式和方便的弹出窗口,其中列出了通常输入的时间。

页面底部为您提供了几个选项:

  • 保存 – 保存更改并返回到此类型的更改列表页面 对象。
  • 保存并继续编辑 – 保存更改并重新加载管理页面 此对象。
  • 保存并添加另一个 – 保存更改并为此加载新的空白表单 对象的类型。
  • 删除 – 显示删除确认页面。

如果“发布日期”的值与您创建 教程 1 中的问题,可能 表示您忘记为TIME_ZONE设置设置正确的值。 更改它,重新加载页面并检查是否显示正确的值。

通过单击“今天”和“现在”快捷方式更改“发布日期”。然后 点按“保存并继续编辑”。然后单击右上角的“历史记录”。 你会看到一个页面,列出了通过 Django 管理员对此对象所做的所有更改, 使用进行更改的人员的时间戳和用户名:

当您熟悉模型 API 并熟悉 管理站点,请阅读本教程的第 3 部分以了解 关于如何向我们的投票应用添加更多观看次数。

===========================end=====================================



 
 


编写你的第一个 Django 应用程序,第2部分的更多相关文章

  1. 编写你的第一个django应用程序2

    从1停止的地方开始,我们将设置数据库,创建您的第一个模型,并快速介绍django自动生成的管理站点 数据库设置 现在,打开mysite/settings.py.这是一个普通的python模块,其中模块 ...

  2. 编写你的第一个django应用程序4

    本教程上接教程3,我们将继续开发网页投票应用,本部分将主要关注简单的表单处理以及如何对代码进行优化 写一个简单的表单 让我们更新一下在上一个教程中编写的投票详细页面的模板(‘polls/detail. ...

  3. 编写你的第一个django应用程序3

    这一篇从教程第2部分结尾的地方继续讲起.我们将继续编写投票应用,并且专注于如何创建公用界面--也被称为视图 概况 django视图概念是一类具有相同功能和末班的网页的集合,比如,在一个博客应用中,你可 ...

  4. Django教程:第一个Django应用程序(3)

    Django教程:第一个Django应用程序(3) 2013-10-08 磁针石 #承接软件自动化实施与培训等gtalk:ouyangchongwu#gmail.comqq 37391319 #博客: ...

  5. Django 2.0.1 官方文档翻译: 编写你的第一个 Django app,第一部分(Page 6)

    编写你的第一个 Django app,第一部分(Page 6)转载请注明链接地址 Django 2.0.1 官方文档翻译: Django 2.0.1.dev20171223092829 documen ...

  6. Django 2.0.1 官方文档翻译: 编写你的第一个 Django app,第五部分(Page 10)

    编写你的第一个 Django app,第五部分(Page 10)转载请注明链接地址 我们继续建设我们的 Web-poll 应用,本节我们会为它创建一些自动测试. 介绍自动测试 什么是自动测试 测试是简 ...

  7. 第一个Django应用程序_part3

    一.概述 此文延续第一个Django应用程序part2. 官方文档:https://docs.djangoproject.com/en/1.11/intro/tutorial03/ view是Djan ...

  8. 编写你的第一个Django应用

    安装 Python 作为一个 Python Web 框架,Django 需要 Python.更多细节请参见 我应该使用哪个版本的 Python 来配合 Django?. Python 包含了一个名为  ...

  9. 搭建你的第一个Django应用程序

    首先你要确保你机器上面安装了python:Python开发_python的安装 python的相关学习资料:http://www.cnblogs.com/hongten/tag/python/ 其次, ...

  10. Django教程:第一个Django应用程序(4)

    Django教程:第一个Django应用程序(4) 2013-10-09 磁针石 #承接软件自动化实施与培训等gtalk:ouyangchongwu#gmail.comqq 37391319 #博客: ...

随机推荐

  1. Sqlsugar 跨库查询小心得(同服务器不同数据库)

    同一个服务器下的不同数据库,目前还没有进行跨服务器的查询,以后有待研究-- 1.使用的是Left Join左查询,因此连接字符串应该是写的第一个表所在的数据库的连接字符串 假设数据库A,B,连接字符串 ...

  2. Error: Assertion failed (nimages > 0) in cv::calibrateCameraRO, file D:\opencv4\opencv\opencv-4.1.0\modules\calib3d\src\calibration.cpp, line 3691

    报错信息: Error: Assertion failed (nimages > 0) in cv::calibrateCameraRO, file D:\opencv4\opencv\open ...

  3. 万字长文,一篇吃透WebSocket:概念、原理、易错常识、动手实践

    本文由作者"阿宝哥"分享,原题"你不知道的 WebSocket",有修订和改动. 1.引言 本文将从基本概念.技术原理.常见易错常识.动手实践等多个方面入手,万 ...

  4. C Primer Plus 第6版 第七章 编程练习参考答案

    编译环境VS Code+WSL GCC 源码请到文末下载 . 注意:本章部分题目有些超纲(回用到函数调用),不理解的同学可以先去看一下后面的知识点和注释. /*第1题***************** ...

  5. Ubuntu 添加多用户和Samba

    USERNAME="$1" SMBFILE="/etc/samba/smb.conf" if [ $# != 1 ] then echo "使用方: ...

  6. 人类讨厌AI的缺点,其实自己也有,是时候反思了。

    马特·科拉默摄于Unsplash 前言:人类讨厌AI,其实就是讨厌自己! 如果你问一些人对人工智能的看法,你可能会听到诸如不道德.偏见.不准确甚至操纵这样的词语. 人工智能因为种种原因正备受批评.它让 ...

  7. 化繁为简、性能提升 -- 在WPF程序中,使用Freetype库心得

    本人使用WPF开发了一款OFD阅读器,显示字体是阅读器中最重要的功能.处理字体显示有多种方案,几易其稿,最终选用Freetype方案.本文对WPF中如何使用Freetype做简单描述. OFD中有两种 ...

  8. MySQL---索引-性能-配置参数优化

    一般来说,要保证数据库的效率,要做好以下四个方面的工作:数 据库设计.sql语句优化.数据库参数配置.恰当的硬件资源和操作系统,这个顺序也表现了这四个工作对性能影响的大小.下面我们逐个阐明: 1.设计 ...

  9. ClickHouse介绍-示例

    示例 GitHub 事件数据集 数据集包含了GitHub上从2011年到2020年12月6日的所有事件,大小为31亿条记录.下载大小为75 GB,如果存储在使用lz4压缩的表中,则需要多达200 GB ...

  10. w3cschool-Linux shell教程

    Shell 教程 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言. Shell 是指一种应用程序,这个应用程序提供了一个 ...