本节内容我们将配置数据库,创建第一个 model 并且快速了解 Django 自动生成的管理后台 (admin site)
目录
打开上一节中新建的项目的配置文件,它是一个普通的 python 模块。
默认情况下,数据库配置使用 SQLite,如果你数据库的新手,或者你仅仅是对 Django 感兴趣,这是最好的选择。SQLite 包含在 Python,所以不需要安装任何东西。当你开始你的第一个真正的项目的时候,你可能想
要使用更强大的数据库如 PostgreSQL,去避免切换数据库的痛苦。
如果你希望使用另外一个数据库,需要安装对应的数据库驱动并且修改键 DATABASES 的'default'项为匹配的数据库连接设置:
如果你不使用 SQLite 作为你的数据库,那么需要另外的设置如:USER,PASSWORD, 和 HOST 必须要添加。关于 databases 的详细配置我们将单独讲解。
对于 SQLite 以外的数据库
如果你使用 SQLite 以外的数据库,请确保你已经创建了一个数据库,也要确保在 mysite/settings.py 中提供的用户具有 "创建数据库" 的权限,允许自动创建一个测试数据库在后面的教程中将会用。如果你使用 SQLite 不需要做任何事情,数据库文件将会在你需要的时候自动创建。
另外,注意在 mysite/settings.py 文件的顶部设置,里面包含当前项目中所有被激活的 Django 应用的名称。应用可以在多个项目中使用,你可以打包并分发给其他的项目使用。
默认情况下,INSTALLED_APPS 包含如下应用:
这些应用至少使用数据库中的一个表,虽然如此,在我们使用它们之前我们需要在一个数据库里面创建表,可以运行下面的命令做到它:
- $ python manage.py migrate
migrate 命令将查找 INSTALLED_APPS 的设置,并且创建符合你在 mysite/settings.py 文件中配置的数据库的任何有必要的数据库表并且随应用迁移,如果说 INSTALLED_APPS 里面的应用不需要的话那么在运行 migrate 之前把它注释或删除掉即可。
现在我们定义模型,在我们创建的投票应用中,我们创建两个模型:Question 和 Choice。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 每一个字段是什么数据类型。Field 类的实例的名称(如,choice_text),就是数据库表的字段名。
有些 Field 类是需要必须参数的,比如 CharField,必须要提供 max_length 的参数。它不仅仅会在数据库架构中用,在验证中也会用到。一个字段可以有多个可选参数,在本例中,我们设置 votes 的默认值为 0;
最后,注意在本例中使用 ForeignKey 定义了一个关系,它告诉 Django 每个 Choice 对应一个 Question。Django 支持所有的数据库关系:多对一,多对多,一对一。
简单的模型定义告诉 Django 很多信息,有了他,Django 可以:
但是首先需要告诉我们的 Django 项目 polls 应用已经被安装了。再次编辑 mysite/settings.py 文件,修改 INSTALLED_APPS,把'polls.apps.PollsConfig'加入列表,如下所示:
|
注意:INTALLED_APPS 列表直接写应用的名称也是可以的(如,'polls'),官方建议是写 AppConfig 的子类,'polls.apps.PollsConfig'中 PollsConfig,这个类在创建应用时已经自动创建好了,在 polls/apps.py 文件里面定义,这个类里面可以定义关于应用的一些元数据如应用名称,描述等信息,Django 提供了一些公用 API 可以读取里面的配置信息,暂时没有发现其他什么特别的用处。
现在 Django 已经知道包含了 polls 应用了,运行另外一个命令:
- $ python manage.py makemigrations polls
你可以看到如下的内容:
|
通过运行 makemigrations,就是告诉 Django 项目模型已经有了那些修改,并且存储这些修改信息在 polls/migrations/0001_initial.py 文件中。
如果你想查看迁移将在数据库中执行哪些操作,可以运行命令:
- $ python manage.py sqlmigrate polls 0001
你将可以看到迁移所用到的 Sql 语句。
注意以下几点:
如果你感兴趣的话可以运行 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
迁移的命令是非常强大的,让你可以随时修改你的模型,而不需要删除你的数据库或表,可以很方便升级你的数据库,不会丢失数据,后面会详细介绍他们,现在你只要记住需要三步来应用模型的变化:
现在,让我们进入 Python shell 的交互式环境并且使用 Django 提供的免费 API。使用如下命令进入 python shell:
- $ python manage.py shell
这个命令是进入我们项目的 shell 交互环境,现在我们可以使用 API 来操作表:
- #创建一个问题,Django默认有日期模块,所以这儿使用timezone >>> from django.utils import timezone >>> q = Question(question_text = "What's New ? ", pub_date = timezone.now())#保存对象到数据库,你必须明确调用save()方法 >>> q.save()#现在你可以访问model字段的值了 >>> q.id 1 >>> q.question_text What's new ? "#修改你要修改的属性,然后调用save()方法 >>> q.question_text = "What's up ? " >>> q.save()#查询所有问题信息 >>> Question.objects.all()] > #查询投票选择 >>> q.choice_set.all()
上面的查询信息返回 <QuerySet [<Question: Question object>]>,我们不知道这个对象都有什么东西,那么怎么解决这个问题呢,接下来分别在 Question 和 Choice 增加__str__方法,编辑文件 polls/models.py:
- from django.db import models from django.utils.encoding import python_2_unicode_compatible@python_2_unicode_compatible#如果需要支持python 2.x的话,加上这个修饰符class Question(models.Model) : #...def __str__(self) : #在python 2.x中,函数名为__unicode__
- return self.question_text@python_2_unicode_compatible#如果需要支持python 2.x的话,加上这个修饰符class Choice(models.Model) : #...def __str__(self) : #在python 2.x中,函数名为__unicode__
- return self.choice_text
再次进入 python shell 环境,查看所有信息:
- >>> Question.objects.all()
这个后台主要是方便客户或员工来管理网站内容的
首先我们需要创建一个可以登录到管理站点的用户,运行下面的命令:
- $ python manage.py createsuperuser
按照提示输入用户名、邮箱地址、密码;现在管理员用户已经创建好了,输入命令 python manage.py runserver 启动开发服务器,然后在浏览器输入地址,就可以用我们刚刚创建的用户登录系统。
登录后系统我们发现,在管理界面首页并没有我创建的投票应用,那么现在我们来看一下我们的应用如何注册到管理系统,编辑文件 polls/admin.py:
- from django.contrib import admin from.models import Question admin.site.register(Question)
现在 Question 已经注册了,打开后台管理的首页就可以看到我们的应用:
现在你可以对 Question 进行管理了。
注意一下几点:
注意:在后台管理系统设置好后,如果系统的图片都显示不出来,需要在 mysite/settings.py 加入如下设置:
- import mimetypes mimetypes.add_type("image/svg+xml", ".svg", True) mimetypes.add_type("image/svg+xml", ".svgz", True)
可能是因为系统中没有 SVG 媒体类型的设置。
来源: http://www.cnblogs.com/caoshiqing/p/5836885.html