上一篇文章我们介绍了创建项目,打开浏览器访问http://127.0.0.1:8000/polls/,能看见"投票主页视图"等描述。
本篇文章我们接着上一篇文章继续学习,在Python之Django系列-初始Django-1介绍到Django是一个MTV框架,M代表Model即模型层,模型层通常是与数据库做交互,而Django中与数据库相关的配置在mysite/settings.py文件中,在修改配置文件前,我们先设置该配置文件中的时区为"Asia/Shanghai",配置如下:
TIME_ZONE = 'Asia/Shanghai'
在Django中,默认使用的数据库为SQLite,具体的配置如下:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
当然我们也可以更改为其他数据库,如Oracle,Mysql,Pg等等,下面的配置为Mysql配置,其他配置也可参考类似:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mydatabase',
'USER': 'mydatabaseuser',
'PASSWORD': 'mypassword',
'HOST': '127.0.0.1',
'PORT': '3306',
}
}
其中ENGINE属性是数据库引擎驱动,根据自己所需选择不同数据库引擎,主要有以下几种:
- django.db.backends.sqlite3
- django.db.backends.postgresql
- django.db.backends.mysql
- django.db.backends.oracle
以上为数据库配置,配置文件中还有一个重要的配置为INSTALLED_APPS,默认包含了以下Django自带应用:
- django.contrib.admin -- 管理员站点, 你很快就会使用它。
- django.contrib.auth -- 认证授权系统。
- django.contrib.contenttypes -- 内容类型框架。
- django.contrib.sessions -- 会话框架。
- django.contrib.messages -- 消息框架。
- django.contrib.staticfiles -- 管理静态文件的框架。
这些默认应用提供了一个项目常用的框架,当然要使用这些应用,我们需要依赖对应这些默认应该所需的表,通过以下命令可以同步默认应用下所有相关的表到数据库中:
E:\Developer\python\Django\mysite>python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying auth.0012_alter_user_first_name_max_length... OK
Applying sessions.0001_initial... OK
migrate命令会检查INSTALLED_APPS配置,为每一个应用创建对应的表,执行完之后,可以在对应的数据库中查询到对应的表
创建投票应用模型
投票应用我们分为Question和Choice两个模型,Question 模型包括问题描述和发布时间。Choice 模型有两个字段,选项描述和当前得票数。每个选项属于一个问题。
找到polls/models.py 文件并编辑:
from django.db import models
# Create your models here.
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,模型中的变量代表为数据库中的字段,在该代码中,可以看到CharField,DateTimeField,IntegerField等都代表为数据库表中的字段类型,有使用过数据库的基本都能理解,max_length代表字符长度,default为数据库默认值,其他字段如下:
通过上述模型Django可以为该模型生成对应的数据库表,但前提是,我们需要安装该应用到我们项目mysite
怎么安装?
在mysite/settings.py中找到INSTALLED_APPS变量,把"polls.apps.PollsConfig"加到最后一行,最终如下:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'polls.apps.PollsConfig',
]
接下来执行如下命令
python manage.py makemigrations polls
将会看到如下输出:
Migrations for 'polls':
polls/migrations/0001_initial.py
- Create model Question
- Create model Choice
通过运行 makemigrations 命令,Django 会检测你对模型文件的修改,然后通过migrate命令可以对修改的内容同步到数据库,但是在执行命令之前,我们可以看看会migrate将会执行什么样的SQL命令,通过如下命令查看:
E:\Developer\python\Django\mysite>python manage.py sqlmigrate polls 0001
--
-- 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);
--
-- 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, `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`);
查看将要执行的SQL语句没问题,现在我们可以执行migrate命令进行同步
python manage.py migrate
执行完成之后,将会把本次的Model更改内容同步到对应的数据库表结构上,这个功能非常强大,后面基本会用到,基本流程为:
- 编辑 models.py 文件,改变模型。
- 运行 python manage.py makemigrations 为模型的改变生成迁移文件。
- 运行 python manage.py migrate 来应用数据库迁移。
在以上命令成功执行后,对应的也会自动生成和数据库做交互的API
API尝试
通过以下命令,进入Python交互式命令行:
E:\Developer\python\Django\mysite>python manage.py shell
Python 3.8.2 (tags/v3.8.2:7b3ab59, Feb 25 2020, 23:03:10) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from polls.models import Question,Choice
>>> Question.objects.all()
<QuerySet []>
>>> from django.utils import timezone
>>> q = Question(question_text="问题是什么", pub_date=timezone.now())
>>> q.save()
>>> q.id
1
>>> q.question_text
'问题是什么'
>>> q.pub_date
datetime.datetime(2020, 12, 6, 9, 42, 43, 472917, tzinfo=<UTC>)
>>> q.question_text='问题是这样?'
>>> q.save()
>>> Question.objects.all()
<QuerySet [<Question: Question object (1)>]>
如需退出命令行,执行方法exit()
Django管理界面介绍
首先,我们得创建一个能登录管理页面的用户。请运行下面的命令:
python manage.py createsuperuser
然后按照提示输入用户名,邮箱,密码即可,最后显示"Superuser created successfully."既表示创建用户成功,接着重新启动服务器,运行如下命令:
python manage.py runserver
启动成功之后,打开浏览器,输入地址:http://127.0.0.1:8000/admin/提示输入用户名和密码,为刚才通过命令创建的用户名和密码
登录成功后即跳转到如下页面:
在该界面中没有看到我们的投票相关应用,我们需要手工修改如下代码,找到polls/admin.py并编辑:
from django.contrib import admin
from .models import Question
# Register your models here.
admin.site.register(Question)
保存后,不用重启服务器,刷新页面即可看到如下
Choice模型同样操作也可显示在界面上,到这里,基本上我们可以在管理后台进行数据修改,删除,新增等操作