第一个django应用[part2]
设置数据库
打开mysite/settings.py,在该文件中描述了django的设置。django默认使用的是SQLite,如果只是为了学习django,这是个很好的开始。
如果希望使用其它数据库,那就需要安装相应的database bindings,并改变DATABASES中的‘default‘项,用于匹配数据库的联接设置:
- ENGINE:可以是’django.db.backends.sqlite3’、’django.db.backends.postgresql’、’django.db.backends.mysql’或’django.db.backends.oracle’等其它后端名字,这和使用的数据库有关。
- NAME:数据库的名字。如果使用的是SQLite,数据库会是电脑上的一个文件,所以NAME应该是完整的绝对路径名。
设置mysite/settings.py中的TIME_ZONE
TIME_ZONE = 'Asia/Shanghai'
INSTALLED_APPS保存了所有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会根据mysite/settings.py中数据库的设定,创建INSTALLED_APPS中所必须的数据表。
创建模型
在poll应用中需要建立两个模型:Question和Choice。Question中包含了question和publication date。Choice有两个字段:text型的choice和vote。每个Choice都关联一个Question
from django.db import models
from django.utils import timezone
import datetime
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField("date published")
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)
PS:红色部分在这个教程的第5部分会用到
这里的每个模型都是继承django.db.models.Model类的子类。每个模型都有很多的类变量,它们用来描述模型中的数据库字段。
每个字段都是Field类的实例,如:CharField是字符型字段,DateTimeField是datetime型字段。
每个Field实例的名字就是数据表的字段名,如:question_text或pub_data。
Field的第一个可选的位置参数用于设置人类可读的名字,它用于Django内部,也可以用于文档作用。如果没提供的话Django会使用一个机器可读的名字。在上面的例子中只为Question.pub_date设置了人类可读名。
一些Field类需要限定参数。如CharField用max_length限定字符长度。还有一些可以设置默认值,default。
最后有定义了一个关联,使用ForeignKey。它告诉Django每个Choice都被关联到一个Question上。django支持所有常用的数据库关系:多对一、多对多和一对一。
激活模型
在激活模型前先让django知道polls应用已经安装了。
polls/apps.py文件中的PollsConfig类,它的python包含路径是’polls.apps.PollsConfig’。编辑mysite/settings.py将它添加到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应用了。运行另一个命令:
$ python manage.py makemigrations polls
会看到类似的输出:
Migrations for 'polls': polls/migrations/0001_initial.py - Create model Question - Create model Choice
通过运行makemigrations告诉django模型有了改变,并且这些改变存储为migration。
migration存储了如何改变模型的方法,可以通过查看polls/migrations/0001_initial.py文件,得知做了哪些具体操作,这个文件就是设计用于人类可读的,可用于手动微调。
现在使用migrate在数据库中建立这些表:
$ python manage.py migrate
使用django shell API
$ python manage.py shell
没直接使用python的原因是manage.py设置了DJANGO_SETTINGS_MODULE环境变量,这将为django提供导入mysite/settings.py的路径。之后就可以导入django中的模型进行控制台的手动操作。如:
from polls.modes import Choice, Question Question.objects.all() from django.utils import timezone() q=Question(question_text="What's new?", pub_date=timezone.now()) q.save() q.id q.question_text q.pub_date q.question_text = "What' up?" q.save() Question.objects.all() 等等操作吧!
介绍一下Django的管理
建立管理员账号
$ python manage.py createsuperuser
然后填写管理员账号信息,之后就可以运行服务器通过http://localhost:8000/admin 来登陆管理了。
不过现在登录进去还看不到polls应用和新建的模型,打开polls/admin.py文件,做如下编辑
from django.contrib import admin from .models import Question admin.site.register(Question)
这时再刷新页面就可以看到polls应用和Question模型了,现在应该看到使用admin和shell管理的差别了吧!各有优点吧!