目录
No. 1 数据库设置
打开 mysite/settings.py文件,找到数据库设置地方,如下图
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } }
这是django自带的小型数据库sqlite。如果您希望使用其他数据库,请安装适当的数据库绑定,并更改数据库“默认”项中的下列键,以匹配您的数据库连接设置,解释一下上述参数:
ENGINE
–不同的数据库对应不同的ENGINE,大概就这几种'
django.db.backends.sqlite3'
, 'django.db.backends.post
ysql'
, 'django.db.backends.oracle','
django.db.backends.mysql',当然其它一些后端如:Microsoft SQL Server,ODBC也能用。
NAME
–这个就是数据库的名称。如果使用SQLite,数据库将是计算机上的一个文件;在这种情况下,名称应该是该文件的完整绝对路径,包括文件名。默认值os.path。join(BASE_DIR, 'db.sqlite3')将文件存储在项目目录中。
当然,如果不使用SQLite作为数据库,则必须添加其他设置,如用户、密码和主机。
当连接到其他数据库后端(如MySQL、Oracle或PostgreSQL)时,将需要额外的连接参数。有关如何指定其他数据库类型,请参见下面的引擎设置。这个例子是为MYSQL:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 数据库不同,engine不同
'NAME': 'mydatabase', # 数据库名称
'USER': 'mydatabaseuser', # 用户名
'PASSWORD': 'mypassword', # 密码
'HOST': '127.0.0.1', # IP
'PORT': '3306', # 端口
}
}
除了上面,你还需要下载pysql模块来连接mysql数据库,终端下运行
pip install pymysql
这样还没完成,还需要在mysite/__init__.py上加上:
import pymysql
pymysql.install_as_MySQLdb()
什么原因,Python在连接MySQL的模块里面,Python2的mysqldb模块在Python3叫pymsql模块,django框架还是识别python2的mysqldb模块。
在 mysite/settings.py中,
TIME_ZONE变量设置你的时区
TIME_ZONE = 'Asia/Shanghai' # 中国时区
另外,注意文件顶部的INSTALLED_APPS设置。它保存在这个Django实例中激活的所有Django应用程序的名称。应用程序可以在多个项目中使用,您可以打包和分发它们,供其他人在其项目中使用。
INSTALLED_APPS = [ '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/settings中的数据库设置创建任何必要的数据库表
No. 2 创建模型
模型是数据真实性的唯一、确定的来源。它包含要存储的数据的基本字段和行为。
在我们的polls应用程序中,我们将创建两个模型:问题和选择。一个问题有一个问题和一个发布日期。一个选项有两个字段:选择的文本和投票计数。每个选择都与一个问题相关。这些概念由简单的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表示。每个模型都有许多类变量,每个类变量表示模型中的一个数据库字段。
就拿类Question来说,迁移到数据库中就是一张表。question_text,pub_date就是表中的列,因为Question继承了models.Model,该表还有一个主键id列,自动增加。表中每列在加上数据类型限制,例如,votes = models.IntegerField(default=0),表示在表Choice中,有一列名称为votes,必须输入为整数,默认值为0。
最后,注意使用ForeignKey定义了一个关系。这告诉Django每个选项都与单个问题相关。Django支持所有常见的数据库关系:多对一、多对多和一对一。
No. 3 激活模型
要将该应用程序包含在我们的项目中,我们需要在INSTALLED_APPS设置中添加对其配置类的引用。PollsConfig类在poll /apps中。它的点路径是'polls.app.pollsconfig '。编辑mysite /setting.py,并将该点路径添加到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知道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
通过运行makmigration,您告诉Django您已经对模型做了一些更改(在本例中,您已经做了一些新的更改),并且您希望将这些更改存储为迁移。
迁移是Django存储对模型(以及数据库模式)的更改的方式——它们只是磁盘上的文件。如果您愿意,可以阅读新模型的迁移;它是文件poll /migration /0001_initial.py。不要担心,您不需要每次Django生成一个时都阅读它们,但是如果您想手动调整Django的更改方式,那么它们是可编辑的。
有一个命令将为您运行迁移并自动管理数据库模式——这称为migrate,我们稍后将讨论它——但是首先,让我们看看迁移将运行什么SQL。sqlmigrate命令获取迁移名称并返回它们的SQL:
$ python manage.py sqlmigrate polls 0001
运行结果:
BEGIN;
--
-- Create model Choice
--
CREATE TABLE `polls_choice` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `choice_text` varchar(200) NOT NULL, `votes` integer NOT NULL);
--
-- Create model Question
--
CREATE TABLE `polls_question` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `question_text` varchar(200) NOT NULL, `pub_date` datetime(6) NOT NULL);
--
-- Add field question to choice
--
ALTER TABLE `polls_choice` ADD COLUMN `question_id` integer 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`);
COMMIT;
makemigrations模型迁移就是将python语句变为SQL,如果你懂数据库基础,我就不多说了。
请注意以下几点:
准确的输出将根据您使用的数据库而有所不同。上面的示例是为MySQL生成的。
自动添加主键(id)。(你也可以重写这个。)
按照约定,Django向外键字段名追加“_id”。(是的,您也可以覆盖它。)
外键关系由外键约束显式表示。不要担心可延迟的部分;这只是告诉MySQL在事务结束之前不要强制外键。
它是根据您使用的数据库定制的,因此数据库特定的字段类型,如auto_increment (MySQL)、serial (PostgreSQL)或integer primary key autoincrement (SQLite)将自动为您处理。字段名的引用也是如此——例如,使用双引号或单引号。
sqlmigrate命令实际上并不在数据库上运行迁移—它只是将迁移结果打印到屏幕上,这样您就可以看到SQL Django认为需要什么。它有助于检查Django将要做什么,或者如果您的数据库管理员需要SQL脚本进行更改,那么它也非常有用。
现在,再次运行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
总的来说,就3步:
- 创建你的模型(在polls/models.py)
- 将模型类中的python语句迁移为你设置的数据库语言(python manage.py makemigrations polls)
- 将SQL语句在数据库运行,完成创建表(python manage.py migrate)
No. 4 使用Django提供的免费API
对于这点,我最开始学认为是可以跳过的,后面有admin界面管理,简单得多。为什么要说呢,还是因为实际运用需要呀。
现在,让我们跳到交互式Python shell中,使用Django提供的免费API。要调用Python shell,使用以下命令:
$ python manage.py shell
我们使用这个而不是简单地输入“python”,因为是manage.py文件中设置DJANGO_SETTINGS_MODULE环境变量,它为Django提供了mPython导入mysite/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=<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中)来解决这个问题。并在问题和选择中添加__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的自动生成的管理中,对象的表示形式是被使用的。
注意,这些是正常的Python方法。你也可以自定义方法,这在后面会学到
No. 4 介绍Django后台管理
为您的员工或客户端生成用于添加、更改和删除内容的管理站点是一项乏味的工作,不需要太多创造力。 因此,Django完全自动地为模型创建管理接口。
管理员不打算供站点访问者使用。这是给网站管理员的。
首先,我们需要创建一个可以登录到管理站点的用户。运行以下命令:
$ python manage.py createsuperuser
-
输入您想要的用户名并按Enter。
Username: admin
-
输入您想要的邮箱并按Enter。
Email address: admin@example.com
-
输入您想要的密码并按Enter。
Password: ********** Password (again): ********* Superuser created successfully.
启动开发服务器:
$ python manage.py runserver
现在,打开Web浏览器,转到本地域的“/admin/”,例如http://127.0.0.1:8000/admin/。你应该看到管理员的登录屏幕:
登录后,就看到这样:
让投票应用程序在管理员中可修改
但我们的投票应用程序在哪里?它不会显示在admin索引页面上。
只需要做一件事,我们需要告诉管理员问题对象有一个管理界面。为此,打开poll s/admin.py文件,编辑成这样:
from django.contrib import admin
from .models import Question
admin.site.register(Question)
现在我们已经注册了问题,Django知道它应该显示在admin index页面上,刷新:
这个是polls/models.py中Question类的迁移,另外Choice类也一样
这里需要注意的是:
表单是由问题模型自动生成的。
不同的模型字段类型(DateTimeField、CharField)对应于相应的HTML输入小部件。
点击“今日”和“现在”快捷键更改“发布日期”。然后单击“保存并继续编辑”。然后点击右上角的“历史”。您将看到一个页面,其中列出了通过Django admin对该对象所做的所有更改,以及更改者的时间戳和用户名。
当您熟悉models API并熟悉管理站点时,请阅读Django 2.1.6.学习初级篇(3),了解如何向投票应用程序添加更多视图。