MySQL“全能”选手—Django 1.10文档中文版Part1

迎大家拜我的民用网站《刘江的博客及科目》:www.liujiangblog.com

要分享Python 及Django教程以及有关的博客


正文是博主翻译的Django1.10版本官方文档的首先局部,如时间充足,争取一直翻译下,经验不足,或产生摩擦漏,敬请指正。
另外对于公开文档进行翻译的版权问题非是生懂,如有侵权请联系自身!

除此以外,要转载该系列翻译文章,也求联系博主。

其次片段传递门

其三组成部分传递门

季部分传送门

3.2 模型与数据库Models and
databases

3.2.2 查询操作making
queries

3.3.8
会话sessions

目录

第一章节、Django1.10文档组成结构
1.1 获取帮助
1.2 文档的集团形式
1.3 第一步
1.4 模型层
1.5 视图层
1.6 模板层
1.7 表单
1.8 开发流程
1.9 admin站点
1.10 安全性
1.11 国际化和本地化
1.12 性能与优化
1.13 Python兼容性
1.14 地理框架
1.15 常用WEB应用工具
1.16 其它核心职能
1.17 Django开源项目

第二章、起步
2.1 Django速览

  • 2.1.1 设计而的范model
  • 2.1.2 安装model
  • 2.1.3 使用API
  • 2.1.4 功能强大的动态admin后台管理界面
  • 2.1.5 设计而的路由系统URLs
  • 2.1.6 编写而的视图views
  • 2.1.7 设计而的模版
  • 2.1.8 总结

2.2 快速安装指南

  • 2.2.1 安装Python
  • 2.2.2 安装Django
  • 2.2.3 安装验证

2.3 第一个Django app,Part 1:请求和响应

  • 2.3.1 创建project
  • 2.3.2 开发服务器development server
  • 2.3.3 创建投票程序(polls app)
  • 2.3.4 编写视图

2.4 第一个Django app,Part 2:模型和admin站点

  • 2.4.1 数据库安装
  • 2.4.2 创建模型models
  • 2.4.3 激活模型
  • 2.4.4 学会用API
  • 2.4.5 Django admin站点介绍

先是章节、Django1.10文档组成结构

1.1 获取帮助

收获帮助的措施:

  • 参照第5.1节之FAQ,这里带有众多广阔问题的答疑
  • 寻找特定的信息?尝试一下智能搜索、混合索引或者内容详细表
  • 当10.2.1的DJango用户邮件列表中寻找信息或者发布问题
  • 在django的IRC频道咨询或者找IRC日志看看是否都发出接近题材
  • 报告DJango中的bug

1.2 文档的团组织形式

Django有许多文档,一个大层次之概览有助于你快找到想如果的信息:

  • 入门教程:手把手的教会你创造一个WEB应用。如果你是只Django或者WEB应用开发者新手,从这边开始修是独是的选择。也得事先看下面的“第一步”。
  • 主题向导:讨论一些较主要之主题与概念,属于比较大的档次,提供一些得力之背景音与讲。
  • 参照指南:包含API的以指导与一部分Django内核的别样方面。主要讲述Django是怎么工作之,如何用它。学习就片之前提是您用对一些关键概念有主导的解与左右。
  • “怎么惩罚”向导:主要讨论一些至关重要的题目及应用状况。比入门教程更透,需要你针对Django的工作体制起自然之打听。

1.3 第一步

而你是Django或程序员新手,那么从这里开始吧!

  • 从零开始:概览 | 安装
  • 入门教程:Part 1:请求与应 | Part 2:模型和admin站点 | Part
    3:视图和模板 | Part 4:表单和泛型 | Part 5:测试 | Part 6:静态文件
    | Part 7:自定制admin站点
  • 高等教程: 如何编写而选用的运用 | 编写而的第一独Django补丁

1.4 模型层

Django提供了一个华而不实的模型层,用于组织和控制而的WEB应用数据。

  • 型:模型介绍 | 字段类型 | Meta选项 | 模型类
  • 询问结果集:执行查询 | 查询结果集艺术参考 | 查询表达式
  • 型实例: 实例方法 | 访问关系对象
  • 搬: 迁移介绍 | 操作参考 | 计划编制 | 编写迁移
  • 高等: 管理器 | 原生SQL | 事务 | 聚合 | 查找 | 自定义字段 | 多数据库
    | 自定义查询 | 查询表达式 | 条件表达式 | 数据库函数
  • 其他:支持的数据库 | 遗留数据库 | 提供初始化数据 | 优化数据库访问 |
    PostgreSQL特发出

1.5 视图层

Django将封装响应用户请求逻辑和归数据称“视图”。在下面的列表中,你能够找到有与视图相关的情:

  • 基本功: 路由安排 | 视图函数 | 快捷方式 | 装饰器
  • 参照: 内置视图 | 请求/响应对象 | 模板响应对象
  • 文本上传: 概览 | 文件对象 | 储存API | 管理文件 | 自定义存储
  • 基类视图: 概览 | 内置显示视图 | 内置编辑视图 | 混合使用 | API参考 |
    分类索引
  • 高级: 生成CSV | 生成PDF
  • 中间件:概览 | 内置中件类

1.6 模板层

模板层提供相同种植人性化的语法,用于渲染展示受用户的内容,主要内容连下列:

  • 基础:概览
  • 对设计师:语言概览 | 内置标签及过滤器 | 人性化
  • 对此程序员: 模板API | 自定义标签及过滤器

1.7 表单

Django 提供了一个情节丰富的框架而便宜地开创表单及操作表单数据。

  • 基础: 概览 | 表单 API | 内置字段 | 内置小器
  • 高档: 模型表单 | 表单外观 | 表单集 | 自定义说明

1.8 开发流程

修不同的零部件和工具,帮助你出及测试Django应用。

  • 设置:概览 | 全部装置列表
  • 应用: 概览
  • 异常:概览
  • Django-admin和manage.py:概览 | 添加于定义命令
  • 测试:介绍 | 编写和运行测试 | 导入测试工具 | 高级主题
  • 布:概览 | WSGI服务器 | 部署静态文件 | 通过邮件跟踪代码错误

1.9 admin站点

在此地,你可找到Django中最为受欢迎之功能模块——admin站点的任何:

  • admin站点
  • admin动作
  • admin文档生成器

1.10 安全性

开 Web 应用时安全是无限要一个之主题,Django 提供了大多复保障工具和建制:

  • 平安概览
  • 披露的Django安全问题
  • 点击劫持的备
  • 跨站请求伪造防护
  • 加密签署
  • 康宁中件

1.11 国际化和本地化

Django
提供了一个强劲的国际化及本地化框架,以扶植您支付支持多国语言与世界各地区之动:

  • 纵观 | 国际化 |本地化 | 本地WEB UI 格式化和表单输入
  • 时区

1.12 性能与优化

有许技术同工具得以扶持你的代码运行得愈加高效、快速,占用更不见的系统资源。

  • 性能和优化概览

1.13 Python兼容性

Django 希望兼容多单不等特色以及本的 Python:

  • Jython支持
  • Python3 兼容性

1.14 地理框架

GeoDjango 想只要举行一个一流的地理Web框架。 它的对象是尽可能轻松的构建GIS
Web 应用及发挥空间数据的力。

1.15 常用WEB应用工具

Django 也付出Web应用提供了余大的工具:

  • 位证明:概览 | 使用验证体系 | 密码管理 | 自定义说明 | API参考
  • 缓存
  • 日志
  • 出殡邮件
  • 一头供稿(RSS/Atom)
  • 分页
  • 信息框架
  • 序列化
  • 会话
  • 站点地图
  • 静态文件管理
  • 数码证实

1.16 其它核心功能

Django的别样核心职能包括:

  • 按需处理内容
  • 内容类型和泛型关系
  • 简易页面
  • 重定向
  • 信号
  • 系检查框架
  • 站点框架
  • 在 Django 中使用 Unicode

1.17 Django开源项目

下是Django项目自己的支出进程同哪些做出贡献相关:

  • 社区: 如何参与 | 发布过程 | 团队组织 | 团队会议 | 最主要人员 |
    源码仓库 | 安全策略 | 邮件列表
  • 计划意见: 概述
  • 文档: 关于按文档
  • 其三正值发行: 概述
  • Django 的千古: API 稳定性 | 发行说明跟升级说明 | 功能弃用时间轴

第二章、起步

2.1 Django速览

Django的出背景是抢节奏的消息编辑室环境,因此它被规划改为一个分外而俱的web框架,能够很快简单的做到任务。本节将速介绍如何以Django搭建一个数据库让的WEB应用。
其不会见有极度多的技术细节,只是于你知Django是何许行事之。

2.1.1 设计而的型model

Django提供了ORM,通过它,你能一直用Python代码来讲述您的数据库设计。下面是一个例证:

# mysite/news/models.py

from django.db import models

class Reporter(models.Model):
    full_name = models.CharField(max_length=70)
    def __str__(self): # __unicode__ on Python 2
    return self.full_name
class Article(models.Model):
    pub_date = models.DateField()
    headline = models.CharField(max_length=200)
    content = models.TextField()
    reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE)
    def __str__(self): # __unicode__ on Python 2
    return self.headline

2.1.2 安装model

通下,进入Django命令行工具,创建数量库表:
$ python manage.py migrate
migrate命令查找所有可用的model,如果它还并未于数据库中设有,将基于model创建相应的申。注:也许你待事先实行$ python manage.py makemigrations命令。

2.1.3 使用API

Django也汝提供了大气之造福的数据库操作API,无需而编额外的代码。下面是单例:

# Import the models we created from our "news" app
>>> from news.models import Reporter, Article
# No reporters are in the system yet.
>>> Reporter.objects.all()
<QuerySet []>
# Create a new Reporter.
>>> r = Reporter(full_name='John Smith')
# Save the object into the database. You have to call save() explicitly.
>>> r.save()
# Now it has an ID.
>>> r.id
1
# Now the new reporter is in the database.
>>> Reporter.objects.all()
<QuerySet [<Reporter: John Smith>]>
# Fields are represented as attributes on the Python object.
>>> r.full_name
'John Smith'
# Django provides a rich database lookup API.
>>> Reporter.objects.get(id=1)
<Reporter: John Smith>
>>> Reporter.objects.get(full_name__startswith='John')
<Reporter: John Smith>
>>> Reporter.objects.get(full_name__contains='mith')
<Reporter: John Smith>
>>> Reporter.objects.get(id=2)
Traceback (most recent call last):
...
DoesNotExist: Reporter matching query does not exist.
# Create an article.
>>> from datetime import date
>>> a = Article(pub_date=date.today(), headline='Django is cool',
... content='Yeah.', reporter=r)
>>> a.save()
# Now the article is in the database.
>>> Article.objects.all()
<QuerySet [<Article: Django is cool>]>
# Article objects get API access to related Reporter objects.
>>> r = a.reporter
>>> r.full_name
'John Smith'
# And vice versa: Reporter objects get API access to Article objects.
>>> r.article_set.all()
<QuerySet [<Article: Django is cool>]>
# The API follows relationships as far as you need, performing efficient
# JOINs for you behind the scenes.
# This finds all articles by a reporter whose name starts with "John".
>>> Article.objects.filter(reporter__full_name__startswith='John')
<QuerySet [<Article: Django is cool>]>
# Change an object by altering its attributes and calling save().
>>> r.full_name = 'Billy Goat'
>>> r.save()
# Delete an object with delete().
>>> r.delete()

2.1.4 功能强大的动态admin后台管理界面

Django包含一个功能强大的admin后台管理模块,使用方便,要素齐全。有助于你速开。你只需要在下面两独文本中形容几句短短的代码:
mysite/news/models.py

from django.db import models
class Article(models.Model):
    pub_date = models.DateField()
    headline = models.CharField(max_length=200)
    content = models.TextField()
    reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE)

mysite/news/admin.py

from django.contrib import admin
from . import models

admin.site.register(models.Article)

2.1.5 设计而的路由系统URLs

Django主张干净、优雅的路由设计,不建议在行程由于中冒出类似.php或.asp之类的字眼。

路由都写于URLconf文件中,它确立由URL匹配模式及python毁掉函数之间的投,起及了解耦的意向。下面是一个事例:
mysite/news/urls.py

from django.conf.urls import url
from . import views
urlpatterns = [
    url(r'^articles/([0-9]{4})/$', views.year_archive),
    url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
    url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
]

Django通过正则表达式,分析看请求的url地址,匹配相应的views,调用对应的函数。

2.1.6 编写而的视图views

诸一个视图都得召开下两桩业务有:返回一个含有呼吁页面数据的HttoResponse对象或弹有一个接近404页面的雅。

寻常,视图通过参数获取数据,并行使它渲染加载的沙盘。下面是一个例子:
mysite/news/views.py

from django.shortcuts import render
from .models import Article
def year_archive(request, year):
    a_list = Article.objects.filter(pub_date__year=year)
    context = {'year': year, 'article_list': a_list}
    return render(request, 'news/year_archive.html', context)

2.1.7 设计而的模版

Django有一个模板查找路径,在settings文件中,你可以指定路线列表,Django自动按顺序以列表中搜索你调用的模版。一个模板看起是下面这样的:
mysite/news/templates/news/year_archive.html

{% extends "base.html" %}
{% block title %}Articles for {{ year }}{% endblock %}
{% block content %}
<h1>Articles for {{ year }}</h1>
{% for article in article_list %}
<p>{{ article.headline }}</p>
<p>By {{ article.reporter.full_name }}</p>
<p>Published {{ article.pub_date|date:"F j, Y" }}</p>
{% endfor %}
{% endblock %}

Django使用好的沙盘渲染语法,Jinja2便是参考其设计下的。双大括号包含起来的是变量,它用给具体的值替换。圆点不但可就此来询问属性,也堪用来调动用字典键值,列表索引和调用函数。
Django具有模板继承、导入和加载的定义,分别使用extend、include和load语法。下面是一个基础模板盖的典范:
mysite/templates/base.html

{% load static %}
<html>
<head>
<title>{% block title %}{% endblock %}</title>
</head>
<body>
<img src="{% static "images/sitelogo.png" %}" alt="Logo" />
{% block content %}{% endblock %}
</body>
</html>

子模板继承母模板的情节,并参加自己独有的有些。通过变母版,可以迅速的修改整改站点的外观和样式。

2.1.8 总结

Django也汝提供了大气之模块和组件,包括模板系统、模型系统、视图系统与其它部分通用组件和专用组件。他们中间还是独的,同时也是可选的,你完全好运用好的沙盘、模型、视图。但是,Django给你提供的是一个集成度高之赛效率完全框架,如果你协调之水平不是深高,那建议还是以Django提供的吧。

2.2 快速安装指南

在第三回的首先省有详细的装置指南,这里仅仅是一个简便的安向导,用于快速搭建环境上下的回。

2.2.1 安装Python

Django与python版本的照应关系。

Django version Python versions
1.8 2.7, 3.2 (until the end of 2016), 3.3, 3.4, 3.5
1.9, 1.10 2.7, 3.4, 3.5
1.11 2.7, 3.4, 3.5, 3.6
2.0 3.5+

请前往Python官网下载并设置python。
另外,python和Django自带轻量级数据库SQLite3,因此,在学习等你无需安装并配置外的数据库。

2.2.2 安装Django

若是你是由此提升之法门安装Django,那么您要先卸载旧的版,具体查看3.1.4节省。
公可以由此下面的3种植艺术安装Django:

  • 装你的操作系统提供的批发本
  • 设置官方版(推荐)
  • 装开发版本

此,请前往Django官网下载最新版本要经pip3 install django进行安装。

下是Django官方对版本的支持政策:
MySQL 1
MySQL 2
设若这是未来颁布版的路线图:
MySQL 3

2.2.3 安装验证

进python环境,输入下列命令,注意版本号和而初装置之同样:

>>> import django
>>> print(django.get_version())
1.10

要么应用命令$ python -m django --version翻看版本号。

下,我们拿进入官方文档提供的编写第一单Django app教程!

2.3 第一只Django app,Part 1:请求和响应

在这事例中,我们以编辑一个问卷调查网站,它含下面两有的:

  • 一个得给人们进行投票和查看结果的公然站点
  • 一个给你可以拓展增删改查的后台admin管理界面

遵学科使用Django 1.10 及Python 3.4以上版本!

2.3.1 创建project

跻身你指定的之一目录,运行下面的授命:
$ django-admin startproject mysite
当下将于目下生成一个mysite目录,也就算是公的这Django项目之根本目录。它含有了平多级自动生成的目及文书,具备各自专有的用途。注意:在吃品种命名的时段要避开Django和Python的保存重要字,比如“django”,“test”等,否则会唤起冲突以及莫名的左。对于mysite的放位置,不建议坐落传统的/var/wwww目录下,它会所有一定的多寡暴露危险,因此Django建议你将品种文件在例如/home/mycode类似的岗位。
一个初植之品类组织大体上如下:

mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        wsgi.py

翔说明:

  • 外层的mysite/目录与Django无关,只是你种之容器,可以随意命名。
  • manage.py:一个命令行工具,用于和Django进行不同措施的彼此脚本,非常主要!
  • 内层的mysite/目录是真正的路文件包目录,它的讳是您引用内部文件的包名,例如:mysite.urls。
  • mysite/init.py:一个概念包之空文件。
  • mysite/settings.py:项目之主配置文件,非常主要!
  • mysite/urls.py:路由于文件,所有的天职还是自从这边开分配,相当给Django驱动站点的情表格,非常关键!
  • mysite/wsgi.py:一个根据WSGI的web服务器进入点,提供底层的网络通信功能,通常并非关心。

2.3.2 开发服务器development server

进mystie目录,输入下面的命:
$ python manage.py runserver
公会相底的提示:

Performing system checks...
System check identified no issues (0 silenced).
You have unapplied migrations; your app may not work properly until they are applied.
Run `python manage.py migrate' to apply them.
September 07, 2016 - 15:50:53
Django version 1.10, using settings `mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

Django提供了一个用以开发的web服务器,使你无需配备一个类似Ngnix的线及服务器,就能够叫站点运行起来。但你为休想拿付出服务器用于生产条件,它只是是一个简单易行的测试服务器。
今日,在浏览器访问http://127.0.0.1:8000/,你将看到Django的欢迎阴面,一切OK!
django开发服务器(以后大概)默认运行在里边的8000端口,如果您想指定,请在命令中形为起,例如:
$ python manage.py runserver 0.0.0.0:8000
地方:Django将运行在8000端口,整个子网内都拿好拜,而未是本机。
留神:
Django的开销服务器具有活动重载功能,当您的代码来涂改,每隔一段时间服务器将自动更新。但是,有一些像增加文件之动作,不见面接触服务器重载,这时便用您自己手动重开。

2.3.3 创建投票程序(polls app)

app与project的区别:

  • 一个app实现有意义,比如博客、公共档案数据库或者简单的投票系统;
  • 一个project是布文件及多独app的聚众,他们做成任何站点;
  • 一个project可以分包多只app;
  • 一个app可以属于多独project!

app的存位置好是其他地方,但是一般咱们用她还置身和manage.py同级目录下,这样有利于导入文本。

跻身mysite目录,确保与manage.py文件处于与一级,输入下述命令:
$ python manage.py startapp polls
网会自动生成 polls目录,其结构如下:

polls/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    views.py

2.3.4 编写视图

每当polls/views.py文件中,输入下列代码:

from django.http import HttpResponse

def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")

为了调用该视图,我们还得编制urlconf。现在,在polls目录中初盘一个文书,名字也urls.py,在其间输入代码如下:

from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^$', views.index, name='index'),
]

生一样步是吃种的主urls文件对我们树立之polls这个app独有的urls文件,你需要先导入include模块,打开mysite/urls.py文件,代码如下:

from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
    url(r'^polls/', include('polls.urls')),
    url(r'^admin/', admin.site.urls),
]

include语法相当给二级路由于政策,它以接纳到之url地址去除了她前面的正则表达式,将盈余的字符串传递给下一级路由于进行判断。在路途由于的章,有更为详细的用法指导。
include的暗是平种即插即用的构思。项目根路由未体贴具体app的路由策略,只管向指定的二级路由于转发,实现了解耦的性状。app所属的二级路由于好依据自己的要自由编写,不会见暨另外的app路由发生冲突。app目录可以放置于另职务,而不用修改路由于。这是软件设计里特别宽泛的等同种模式。
提议:除了admin路由他,你应该尽量吃每个app设计自己单身的二级路由。

吓了,路由于为搭建成功,下面我们启动服务器,然后在浏览器中访问地址http://localhost:8000/polls/。一切正常的言语,你用张“Hello,
world. You’re at the polls index.”

url()函数可以传递4单参数,其中2只是须的:regex和view,以及2独可选的参数:kwargs和name。下面是具体的说明:

regex:
regex是正则表达式的通用缩写,它是同样种植匹配字符串或url地址之语法。Django用在用户请求的url地址,在urls.py文件中对urlpatterns列表中的各国一样桩条款从头开始进行依次比,一旦遇上匹配项,立即执行该条款映射的视图函数或二级路由,其后的章将不再继续配合。因此,url路由的编排顺序至关重要!

用留意的是,regex不见面去匹配GET或POST参数或域名,例如对于https://www.example.com/myapp/,regex只尝试匹配myapp/。对于https://www.example.com/myapp/?page=3,regex也只尝试匹配myapp/。

一经您想深入钻研正则表达式,可以读一些有关的图书还是专论,但是以Django的尽着,你免需差不多胜似深的正则表达式知识。

性注释:正则表达式会展开先期编译当URLconf模块加载的时刻,因此她的相当搜索速度好快,你习以为常感觉不顶。

view:
当正则表达式匹配到某某条目时,自动将打包的HttpRequest对象作为第一单参数,正则表达式“捕获”到之价当次只参数,传递让该条款指定的视图。如果是简单捕获,那么捕获值将作为一个职务参数进行传递,如果是命名捕获,那么以作根本字参数进行传递。

kwargs:
擅自数量的重要字参数可以当一个字典传递让目标视图。

name:
对您的URL进行命名,可以吃您可知在Django的任意处,尤其是模板内显式地引用它。相当给受URL取了单全局变量名,你唯有需要改者全局变量的价,在尽Django中引用它的地方吧以一律得到改观。这是极为古老、朴素和实用的计划性思想,而且这种考虑无处不在。

2.4 第一个Django app,Part 2:模型和admin站点

随后上有些,本节将讲述如何设置数据库,编写第一个模型与简要的牵线下Django自动生成的admin站点。

2.4.1 数据库安装

开辟mysite/settings.py配置文件。Django默认使用内置的SQLite数据库。当然,如果你是于创造一个实际上的种,请以类似MySql的养用数据库,避免事后面临数据库切换的头疼。
若果你想使用别的数据库,请先安装相应的数据库模块,并拿settings文件中DATABASES
’default’的键值进行对应的改,用于连接而的数据库。其中:

ENGINE(引擎):可以是’django.db.backends.sqlite3’或者’django.db.backends.postgresql’,’django.db.backends.mysql’,
or ’django.db.backends.oracle’,当然其它的也行。

NAME(名称):数据库的讳。如果你以的是默认的SQLite,那么数据库将作为一个文书拿存放在于公的地头机械内,NAME应该是此文件之共同体绝对路径,包括文件称。设置中的默认值os.path.join(BASE_DIR,
’db.sqlite3’),将将欠公文储存于公的色目录下。

使你莫是使默认的SQLite数据库,那么一些诸如USER,PASSWORD和HOST的参数必须手动指定!更多细节参考后续之数据库章节。

注意:

  • 当应用非SQLite的数据库时,请务必首先在数据库提示符交互模式下开创数据库,你得下命令:“CREATE
    DATABASE database_name;”。
  • 包您当settings文件中提供的数据库用户拥有开创数量库表的权位,因为于连下去的课程被,我们得活动创建一个test数据库。
  • 要你下的是SQLite,那么你随便需召开另外预先布置,直接采用就足以了。

以修改settings文件时,请顺便用TIME_ZONE设置也您所于的时区。
又,请小心settings文件中顶部的INSTALLED_APPS设置项。它保存了装有的当手上种蒙受激活的Django应用。你必须用您从定义的app注册于此。每个应用可以叫多独品类采用,而且若得打包和分发给其他人在他们的路蒙行使。

默认情况,INSTALLED_APPS中会自行包含下列条目,它们还是Django自动生成的:

  • django.contrib.admin:admin站点
  • django.contrib.auth:身份验证体系
  • django.contrib.contenttypes:内容类型框架
  • django.contrib.sessions:会话框架
  • django.contrib.messages:消息框架
  • django.contrib.staticfiles:静态文件管理框架

点的每个应用都至少需要采取一个数库表,所以当动它前我们要以数据库中创造这些发明。使用此命令:$
python manage.py migrate。

migrate命令将遍历INSTALLED_APPS设置中之兼具品类,在数据库被开创对应之阐发,并打印出各个一样条动作信息。如果你感兴趣,可以于公的数据库命令行下输入:\dt
(PostgreSQL), SHOW TABLES; (MySQL), 或 .schema (SQLite) 来排有 Django
所创的阐发。

提拔:对于极简主义者,你一点一滴可以INSTALLED_APPS内注释掉任何要全体底Django提供的通用应用。这样,migrate也未会见更创对应之数据表。

2.4.2 创建模型models

Django通过打定义python类的样式来定义具体的模子,每个模型代表数据库中的一致摆表,每个接近的实例代表数量表中的一条龙数,类吃的每个变量代表数量表中的平等排字段。Django通过ORM对数据库进行操作,奉行代码优先的看法,将python程序员和数据库管理员进行分工解耦。

于此简单的投票应用被,我们用创造两只模型:Question和Choice。Question包含一个题目及一个发布日期。Choice包含两单字段:选择的文件和投票计数。每一样漫长Choice都关系到同一漫漫Question。这些还是由于python的类似来反映,编写的备是python的代码,不沾任何sql语句。现在,编辑polls/models.py文件,具体代码如下:
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每一个字段保存之数据类型。

各一个 Field 实例的名就是是字段的讳(如: question_text 或者
pub_date
)。在您的Python代码中见面使这个价值,你的数据库也会用是价当表的列名。

君呢得以于每个Field中利用一个可选的第一职参数用于供一个生人可读的配段名,让你的模子更和谐,更易读,并且以让当文档的同等组成部分来提高代码的可读性。在本例中,仅定义了一个合人类习惯的字段名Question.pub_date。对于范中之其它字段,机器名称即使已经足够我们信服读了。

有的Field类必须提供一些特定的参数。例如CharField需要你指定max_length。这不仅仅是数据库结构的待,同样为用于我们后面会谈及之数码证明功能。

发生一定填参数,当然就是会见生可选参数,比如以votes里我们以其默认值设为0.

末请留意,我们以ForeignKey定义了一个外键关系。它告诉Django,每一个Choice关联到一个应和之Question。Django支持通用的多寡涉嫌:一对一,多对同及多对多。

2.4.3 激活模型

面的代码看正在来硌少,但也与Django大量的音信,据此,Django会做下两码事:

  • 缔造该app对应的多寡库表结构
  • 也Question和Choice对象创建基于python的数据库访问API

可是,首先,我们得事先告诉项目,我们就安装了投票应用。

Django思想:应用是“可插拔的”:你可以以差不多单门类以一个用,你也可以分发以,它们不会见受扎到一个加以的
Django 项目蒙。

要将运用添加到项目受到,需要以INSTALLED_APPS设置中益对该用的布文件之链接。对于本例的投票应用,它的配置类文件是polls/apps.py,路径格式为’polls.apps.PollsConfig’。我们得在INSTALLED_APPS中,将拖欠路线上加进去。它看起是这样的:

mysite/settings.py

INSTALLED_APPS = [
'polls.apps.PollsConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]

今昔Django已经知道乃的投票应用之存了,并拿它们在了大家庭。我们还运行下一个命:$
python manage.py makemigrations polls。你会见到类似下面的提醒:

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

通过运行migrations命令,相当给告诉Django你针对你的模子有改,并且你想拿这些反保存也一个“迁移”。

migrations是Django保存模型修改记录的文件,它们是保留于磁盘上的文本。在例子中,它便是polls/migrations/0001_initial.py文件,你可打开她看看,里面保存之都是不过编制的情,方便而无时无刻手动修改。

紧接下去有一个誉为migrate的吩咐将对数据库执行真正的动迁动作,下面我们即将介绍其。但是,在此之前,让咱们事先看当migration的早晚其实试行的SQL语句是呀。有一个称为sqlmigrate的
命令可以展示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的输出。
  • 表名是自动生成的,通过结合使用名 (polls) 和题诗的型名 – question
    和 choice 。 ( 你可以再写这作为。)
  • 主键 (IDs) 是全自动抬高的。( 你吧足以重新写这个作为。)
  • 按照规矩,Django 会在外键字段名及附加 “_id” 。
    (你仍然可更写这作为。)
  • 外键关系由FOREIGN
    KEY显示声明。不要顾虑DEFERRABLE部分,它只是喻PostgreSQL不苟履外键直到工作了。
  • 生成 SQL
    语句时对你所下的数据库,会为卿活动处理特定于数据库的字段,例如
    auto_increment (MySQL), serial (PostgreSQL), 或integer primary key
    (SQLite) 。 在援字段名时也是这样 – 比如利用对引号或单引号。
  • 这些 sql
    命令并于在公的数据库被其实运作,它只是以屏幕上亮出,以便为您打探
    Django 真正执行的是呀。

使你感兴趣,也得运作python manage.py
check命令,它用检查项目遭到保有没有起进行搬迁或者链接数据库的缪。

现今,我们得以运作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

migrate命令对持有还未履行的搬记录进行操作,本质上就是是将您对范的改体现到数据库中现实的表上面。Django通过平等布置称django_migrations的说明,记录并跟已经施行之migrate动作,通过对照获得怎样migrations尚未提交。

migrations的效能特别有力,允许你时刻修改你的模子,而不欲去或新建你的数据库或数据表,在匪丢数据的以,实时动态更新数据库。我们将以后面的节对这进行深入之阐释,但是今,我们惟有待牢记修改模型时的操作分三步:

  • 当models.py中改模型
  • 运行python manage.py makemigrations为改变创建迁移记录
  • 运行python manage.py migrate,将迁移同步到数据库,落实修改动作。

据此要拿创设及施行迁移的动作分成两单指令两步走是以您可能要透过版本控制系统(例如github,svn)提交你的类别代码,如果无一个中级经过的保留文件(migrations),那么github如何知道与记录、同步、实施你所开展了之范修改动作吧?毕竟,github不跟数据库直接打交道,也没法和你本地的数据库打交道。但是分别后,你独自需要拿公的migration文件(例如地方的0001)上传到github,它便会理解一切。

2.4.4 学会以API

下,让咱上python交互环境,学习下Django提供的数据库访问API。要进入python的shell,请输入指令:
$ python manage.py shell

互较直接输入“python”命令的道进入python环境,调用manage.py参数能以DJANGO_SETTINGS_MODULE环境变量导入,它将自动按mysite/settings.py中之装置,配置好而的python
shell环境,这样,你便可导入和调用任何你种外的模块了。

抑或您啊得这样,先上一个十足的python
shell环境,然后启动Django,具体如下:

>>> import django
>>> django.setup()

万一上述操作出现AttributeError异常,有或是若在下一个以及手上课程不般配的Django版本。解决办法是读书比较逊色版本的科目或撤换更新版本的Django。

不论是是哪种方式,你最后还是叫python命令能找到科学的模块地址,得到不错的导入。

当您进去shell后,尝试一下脚的API吧:

    >>> from polls.models import Question, Choice # 导入我们写的模型类
    # 现在系统内还没有questions
    >>> Question.objects.all()
    <QuerySet []>

    # 创建一个新的question
    # Django推荐使用timezone.now()代替python内置的datetime.datetime.now()
    from django.utils import timezone
    >>> q = Question(question_text="What's new?", pub_date=timezone.now())

    # 你必须显式的调用save()方法,才能将对象保存到数据库内
    >>> q.save()

    # 默认情况,你会自动获得一个自增的名为id的主键
    >>> 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()

    # objects.all() 用于查询数据库内的所有questions
    >>> Question.objects.all()
    <QuerySet [<Question: Question object>]>

此处当一下:上面的是一个不行读的始末展示,你无法从中得到任何直观的信,为者我们得平等接触多少技巧,让Django在打印对象时展示有咱们指定的信息。返回polls/models.py文件,修改一下question和Choice这有限只类似,代码如下:

polls/models.py

from django.db import models
from django.utils.encoding import python_2_unicode_compatible

@python_2_unicode_compatible # 当你想支持python2版本的时候才需要这个装饰器
class Question(models.Model):
    # ...
    def __str__(self):   # 在python2版本中使用的是__unique__
        return self.question_text

@python_2_unicode_compatible 
class Choice(models.Model):
    # ...
    def __str__(self):
        return self.choice_text

这技能不但对君打印对象时大有拉,在你以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)

伸手留意点分别导入了点滴单有关时间之模块,一个凡是python内置的datetime一个凡Django工具包提供的timezone。

保留修改后,我们又开动一个新的python shell,再来探外的API:

>>> from polls.models import Question, Choice

# 先看看__str__()的效果,直观多了吧?
>>> Question.objects.all()
<QuerySet [<Question: What's up?>]>

# Django提供了大量的关键字参数查询API
>>> Question.objects.filter(id=1)
<QuerySet [<Question: What's up?>]>
>>> Question.objects.filter(question_text__startswith='What')
<QuerySet [<Question: What's up?>]>

# 获取今年发布的问卷
>>> from django.utils import timezone
>>> current_year = timezone.now().year
>>> Question.objects.get(pub_date__year=current_year)
<Question: What's up?>

# 查询一个不存在的ID,会弹出异常
>>> Question.objects.get(id=2)
Traceback (most recent call last):
...
DoesNotExist: Question matching query does not exist.

# Django为主键查询提供了一个缩写:pk。下面的语句和Question.objects.get(id=1)效果一样.
>>> Question.objects.get(pk=1)
<Question: What's up?>

# 看看我们自定义的方法用起来怎么样
>>> q = Question.objects.get(pk=1)
>>> q.was_published_recently()
True

# 让我们试试主键查询
>>> q = Question.objects.get(pk=1)

# 显示所有与q对象有关系的choice集合,目前是空的,还没有任何关联对象。
>>> q.choice_set.all()
<QuerySet []>

# 创建3个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对象可通过API访问和他们关联的Question对象
>>> c.question
<Question: What's up?>

# 同样的,Question对象也可通过API访问关联的Choice对象
>>> q.choice_set.all()
<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>
>>> q.choice_set.count()
3

# API会自动进行连表操作,通过双下划线分割关系对象。连表操作可以无限多级,一层一层的连接。
# 下面是查询所有的Choices,它所对应的Question的发布日期是今年。(重用了上面的current_year结果)
>>> Choice.objects.filter(question__pub_date__year=current_year)
<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>

# 使用delete方法删除对象
>>> c = q.choice_set.filter(choice_text__startswith='Just hacking')
>>> c.delete()

取得更多关于模型关系之消息,请查看6.15.4章节。更多之数据库API和如何行使对下划线进行查询,请看3.2.2节。

2.4.5 Django admin站点介绍

计划意见:为而的团体或客户编写用于充实、修改和去内容的admin站点是同等项大单调的工作而且没有稍微创造性。因此,Django自动地啊您通过模型构造了一个admin站点。这个站点就为站点管理员使用,并无针对群众开放。

  • 创造管理员用户

率先,通过下的吩咐,创建一个方可登录admin站点的用户:
$ python manage.py createsuperuser
输入用户称:
Username: admin
输入邮箱地址:
Email address: admin@example.com
输入密码:
Password: **********
Password (again): *********
Superuser created successfully.

留神:Django1.10版本后,超级用户MySQL之密码强制要求有所一定的复杂,不能够再偷懒了。

  • 启动开发服务器

服务器启动后,在浏览器访问http://127.0.0.1:8000/admin/。你就能看到admin的登陆界面了:

MySQL 4

  • 进入admin站点

使刚才建立之admin账户,登陆站点,你拿见到如下的界面:

MySQL 5

时已起少数单可编制的情节:groups和users。它们是django.contrib.auth模块提供的身价验证框架。

  • 当admin中登记你的投票应用

而今你还无法看到你的投票应用,必须先在admin中开展注册,告诉admin站点,请将poll的模子在站点内,接受站点的田间管理。

开拓polls/admin.py文件,加入下面的内容:

polls/admin.py

from django.contrib import admin
from .models import Question

admin.site.register(Question)
  • 浏览admin站点的效力

报question模型后,刷新admin页面就可知望Question栏目了。

MySQL 6

点击“Questions”,进入questions的改列表页面。这个页面会显示所有的数据库内的questions对象,你可于此对她进行修改。看到下的“What’s
up?”了么?它就是咱先创建的一个question,并且通过__str__术的扶植,显示了较为直观的音,而非是一个冷漠的对象类型名称。

MySQL 7

下面,点击What’s up?进入编辑界面:

MySQL 8

此间需要专注的是:

  • 表单是由Question模型自动生成的
  • 不等的型字段类型(DateTimeField, CharField)会展现也歧之HTML
    input框类型。
  • 列一个DateTimeField都见面沾一个JS缩写。日期的缩写是Today,并起一个日历弹出框;时间的缩写是Now,并出一个通用的岁月输入列表框。

于页面的平底,则是一些可摘按钮:

  • delete:弹出一个勾确认页面
  • save and add
    another:保存时窜,并加载一个初的空域的此时此刻种对象的表单。
  • save and continue
    editing:保存时改,并更加载该对象的编排页面。
  • save:保存修改,返回时目标类型的列表页面。

如果“Date
published”字段的价值与你在前方教程创建它的时节不同等,可能是若没是的布置TIME_ZONE,在境内,通常是8单小时的时间别。修改TIME_ZONE配置并重复加载页面,就可知显是的时日了。

每当页面的右上斗,点击“History”按钮,你见面见到您针对时目标的装有修改操作都于此出记录,包括修改时间以及操作人,如下图所示:

MySQL 9

及此,你对范API和admin站点有矣定的习,可以上下一阶段的教程了。

当还行就点赞支持一下咔嚓!

网站地图xml地图