Django入门教程(二)

激活模型

极度小的模子代码给了Django很多音信。有个它,Django能够:

  • 为这几个利用(app)创建数据库(CREATE TABLE语句);
  • 创制用于访问QuestionChoice的数据库访问API。

然而,首先大家要求报告大家的品种,polls选取已设置。

提示:Django的行使是“可插拔”的:你可以将一个app使用在八个档次中,也得以颁发你的apps,因为它们并不予给定的Django安装绑定!

来将使用包蕴到大家的档次中,我们需求在INSTALLED_APPS配备中添加对其配置类的引用。本例的安插类即polls/apps.py文件中的PollsConfig类,所以它的引用路径为”polls.apps.PollsConfig“。编辑mysite/settings.py文本,添加该路线到INSTALLED_APPS配置中。

 1 # mysite/settings.py
 2 
 3 INSTALLED_APPS = [
 4     'django.contrib.admin',
 5     'django.contrib.auth',
 6     'django.contrib.contenttypes',
 7     'django.contrib.sessions',
 8     'django.contrib.messages',
 9     'django.contrib.staticfiles',
10     'polls.apps.PollsConfig',
11 ]

 

(简单写法,能够直接助长应用名即”polls”,因为布置类PollsConfig中定义了”name=’polls'”)

现今Django知道已盈盈了polls运用。让大家运行另一个命令:

$ 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,你早就对模型举办了一些修改(在这种情景下,你曾经创设了新的模子),并期待将那几个修改存储为一个搬迁(migration)

Migration(迁移)是“Django如何修改你的模子(以及数据库结构)”
–它们只是磁盘上的文件。如若你喜欢,可以翻阅新模型的迁徙,即文件polls/migrations/0001_initial.py。不要担心,Django创制该公文时您不必要去各样阅读,可是它们被设计成可编制的,你可以手动调整Django修改数据的行为。

有一个指令会运作你的migration并自行管理你的数据库结构 —
调用migrate命令,稍后介绍该命令。首先,让大家来看看migration会运行哪些SQL语句。sqlmagrate命令接受应用名和migration名称,并赶回SQL语句:

$ python manage.py sqlmigrate polls 0001

你应该看到类似于以下内容(我们曾经将内容重新格式化的尤其易读):

BEGIN;
--
-- 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生成。(这几个文档有坑啊,不是说好的用SQLite吗)。
  • 表名是结合使用名称和题诗的model名称(question和choice)自动生成的。(你可以重写那个行为)
  • 主键(ID)将自行抬高。假如您在编写model的时候已经添加了主键,就不会自动生成主键ID了。(那一个也得以重写)
  • 坚守管理,Django会追加”_id”给外键字段名。(你猜我要说怎么?是的,这几个依旧得以重写)
  • 外键关联由FOREIGN
    KEY
    显式表明。不要操心DEFERRABLE一些;它只是为了告知PostgreSQL不要在事情截至前举行外键。
  • 它会适应你利用的数据库,所以数据库的局地奇特字段类型(例如auto_increment–MySQL,
    serial — PostgreSQL, integer primary key autoincrement
    SQLite)会自行为你处理。同样适用于对字段名的引用,例如使用双引号或者单引号。
  • sqlmigrate命令实际上不会在数据库上运行migration指令,它只是将Django认为须求实践的SQL语句打印到显示屏上,以便你能观望。那对于检查Django将要执行的操作尤其实用 or
    if you have database administrators who require SQL scripts for
    changes.(这一句不太懂,先上原文)

如果您有趣味,可以推行python manage.py
check
;它会检讨项目中的所有标题,而不会举行迁移(migration)或创设数据库。

现今,再一次实施migrate,在你的数据库中成立这个模型(model)的表:

$ 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

 

migrate命令使用具有未进行的migration(Django会调用django_migrations跟踪哪个申请采纳数据库中的特殊表)并依照数据库运行它们
— 本质上,将你对模型(model)做的改动同步到数据库的构造中。

使用API

今天,让我们进来交互式的python
shell,并应用Django提供的免费API。要调用Python shell,请使用以下命令:

$ python manage.py shell

大家选拔这么些,而不是简不难单的输入”python”,因为manage.py设置了DJANGO_SETTING_MODULE环境变量,它报告Django
mysite/settings.py文本的python导入路径。

若果您进去shell,请探索database
API
:

>>> from polls.models import Question, Choice   # 导入我们刚写的模型

# 系统中还没有“问题”
>>> Question.objects.all()
<QuerySet []>

# 创建一个新“问题”
# 配置文件中默认启动对时区的支持, 所以Django需要提供一个tzinfo的日期给pub_date.使用timezone.now()
# 而不是datetime.datetime.now()
>>> from django.utils import timezone
>>> q = Question(question_text="What's new?", pub_date=timezone.now())

# 将对象保存到数据库中。你必须显式调用save()
>>> q.save()

# 现在它有一个ID,注意,你可能说是‘1L’而不是‘1’,这取决于你使用的数据库。这意味着你的数据库后端更喜欢返回
# 整数作为Python的长整型对象。
>>> q.id
1

# 通过Python属性访问模型字段值.
>>> q.question_text
"What's new?"
>>> q.pub_date
datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=<UTC>)

# 通过更改属性来更改值,然后调用save().
>>> q.question_text = "What's up?"
>>> q.save()

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

 

等一下,<Question: Question
object>
是对该目的完全无毛用的象征。让大家透过编制Question模型(在polls/models.py文件中),并在QuestionChoice中添加__str__()方法:

 1 # polls/models.py
 2 
 3 from django.db import models
 4 from django.utils.encoding import python_2_unicode_compatible
 5 
 6 @python_2_unicode_compatible  # only if you need to support Python 2
 7 class Question(models.Model):
 8     # ...
 9     def __str__(self):
10         return self.question_text
11 
12 @python_2_unicode_compatible  # only if you need to support Python 2
13 class Choice(models.Model):
14     # ...
15     def __str__(self):
16         return self.choice_text

 

__str__()格局对模型卓殊首要,那不仅仅在拍卖交互式提醒时方便你使用,还因为Django自动生成的admin中采取了对象的意味。

专注这几个是无独有偶的Python方法。大家添加一个自定义的艺术,只是为着演示:

 

# polls/models.py

import datetime

from django.db import models
from django.utils import timezone


class Question(models.Model):
    # ...
    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)

注意 import datettimefrom django.utils import
timezone
,它们分别参考Python标准库的datetime模块和Django中django.utils.timezone的时区关联工具。要是你不熟稔Python中的时区处理,您能够在时区援助文档中打听越多新闻。

封存这一个改变同仁一视新启航一个新的Python交互式shell :python manage.py
shell

>>> from polls.models import Question, Choice

# 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
1.10文档普通话版

 

Migration非凡强大,在付出项目标长河中,使你可以随着岁月的推移来修改模型,而不要求删除数据库或表再创立一个新的

它更加用来实时更新数据库,而不会丢掉数据。大家将在本教程的接续部分中更浓厚地介绍它们,可是现在,请牢记进行模型更改的三步指南:

  • 修改你的模子(在models.py文件中)
  • 执行python manage.py makemigrations 为这几个修改创立迁移
  • 执行 python manage.py migerate 将那个修改应用到数据库中。

将开创和利用migration分为七个指令的案由是您将交给migration到版本控制系统并发送到你的施用;它们不但可以使您的开发更便于,而且仍能被其余开发人士和在生产中选取。

阅读django-admin
documentation
打听有关manage.py实用程序可举办操作得当详细新闻。

 

      提议直接阅读末尾!!!

Writing your first Django app, part 2

 本节将设置数据库,制造您的首个模型(model),并简短介绍Django自动生成的军事管制页面。

数据库设置

现在,打开mysite/settings.py。那是一个平淡无奇的Python模块,代表Django配置的模块级变量。

默许情状下,配置使用SQLite。假诺你初涉数据库,或者只想尝尝Django,这是最不难易行的选取。SQLlite包蕴在Python中,所以你不须求安装对数据库的支撑。当您开头率先个实在的花色时,您或许希望接纳想
PostgreSQL那样更具扩充性的数据库,以幸免数据库切换造成的讨厌。

假定你想采用任何数据库,需求设置响应的数据库绑定,并安插以下DATABASES
‘default’
中的项目来同盟您的数据库连接:

  • ENGINE — 可以为’django.db.backends.sqlite3′,
    ‘django.db.backends.postgresql’,
    ‘django.db.backends.mysql’或者’django.db.backends.oracle’。其余后端也同意选拔
  • NAME
    数据库的称谓。假使接纳SQLite,数据库就是总计机中的一个文件,那么NAME应该是该文件的一体化相对路径(包罗文件名)。默许值os.path.join(BASE_DIR,
    ‘db.sqlite3’)
    ,会将数据库文件保留在你的品种目录中。

一经不是用SQLite作为数据库,需要添加USER,PASSWORD和HOST等附加值。详细操作请参见DATABASES

还必要小心在该文件顶部的INSTALLED_APPS配置。它包蕴了在该Django实例中激活的装有Django应用的称呼。Apps(应用)可以被两个类型采纳,你可以打包并发布给其余品类。

默认情状下,INSTALLED_APPS包罗以下应用,那么些应用随Django一起提供:

  • django.contrib.admin — 管理站点。你会疾速用到它。
  • django.contrib.auth — 认证连串。
  • django.contrib.contenttypes — 内容类型的框架。
  • django.contrib.sessions — 会话框架。
  • django.contrib.messages — 信息框架。
  • django.contrib.staticfiles — 管理静态文件的框架。

这个应用一般景色下被默许包罗在内。

其中部分接纳要运用至少一张数据表,所以大家在利用它们从前必要创制一张数据表。为此,运行一下发令:

$ python manage.py migrate

 

migrate指令会翻动INSTALLED_APPS配备,并基于mysite/setting.py文件中的数据库配置和应用程序随附的数码迁移来创建所有须求的数据库(稍后介绍)。你将看到各种数据迁移的音信。如若你有趣味,您可以在数据库的一声令下行客户端输入\dt(PostgreSQL),
SHOW TABLES;(MySQL), .schema(SQLite) 或者 SELECT TABLE_NAME FROM
USER_TABLES;(Oracle)来展现Django成立的数据表。

 

成立模型(model)

如今我们经过行使额外的元数据来来定义自己的模型(本质上就是数据库的布局)。

 

在我们的poll应用中,我们将开创四个模型:QuestionChoice。每个Question有一个难题和一个发布日期。每个Choice有三个字段:选取文本和投票计数器。每个Choice都和一个Question相关联。

这一个概念由简单Python类表示,编辑polls/models.py文件:

 1 # polls/models.py
 2 
 3 from django.db import models
 4 
 5 
 6 class Question(models.Model):
 7     question_text = models.CharField(max_length=200)
 8     pub_date = models.DateTimeField('date published')
 9 
10 
11 class Choice(models.Model):
12     question = models.ForeignKey(Question, on_delete=models.CASCADE)
13     choice_text = models.CharField(max_length=200)
14     votes = models.IntegerField(default=0)

 

代码很粗略。每个模型都由一个继承自django.db.models.Model的子类表示。每个模型中都有部分类的变量,每个模型中的变量代表一个数据库字段。

种种字段由由Field类的实例表示,例如,CharField用于字符字段,DateTimeField用来一时。那告诉Django每个字段代表怎么样类型的数量。

每个Field实例的称呼(例如question_text,
pub_date)就是字段的名号(以机器友好的格式书写)。你将在Python代码中选拔这几个值,你的数据库将使用它看作列名称。

你可以运用可选的首先个地方参数来给Field指定一个方便人明白(human-readable)的称呼。那用于Django的多少个反省的一些,它能够视作文档。假使该字段没有提供,Django将使用机器刻度(machine-readable)的名目。在本例中,大家只为Question.pub_date字段定义了人类的可读(human-readable)的名称。本例中的其余字段,字段的机器名称丰富作为人类可读的名目。(翻译完那段感觉自己早已成仙了/(ㄒoㄒ)/~~)

一些Field类有必不可少的参数。例如CharField,须求给它一个max_length。这不光在数据库架构中接纳,而且用于注脚,大家就要见到。

Field也可能存在部分可选参数,本例中,我们为votes设置了default值为0。

末尾,注意一个关联的概念,使用ForeignKey。它告诉Django每个Choice都与一个Question涉及。Django扶助具有大规模的数据库关联:多对一,多对多,一对一。

 

网站地图xml地图