第一个django应用[part2]

第一个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应用中需要建立两个模型:QuestionChoiceQuestion中包含了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类需要限定参数。如CharFieldmax_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管理的差别了吧!各有优点吧!

Comments are closed.