接上一篇Python3.0 Django2.0.4 搭建项目(一)记录,这一篇主要记录我们将建立数据库,创建第一个模型,还有 Django 提供的自动生成的admin管理页面。
数据库配置
打开 mysite/settings.py文件,里面有一个INSTALLED_APPS,我们可以了解一下这里面Django 的自带应用
django.contrib.admin -- 管理员站点, 你很快就会使用它。
django.contrib.auth -- 认证授权系统。
django.contrib.contenttypes -- 内容类型框架。
django.contrib.sessions -- 会话框架。
django.contrib.messages -- 消息框架。
django.contrib.staticfiles -- 管理静态文件的框架。
这些应用被默认启用是为了给常规项目开发提供方便。
在上一篇中我们有提到一个数据库的问题,这是默认开启的某些应用需要至少一个数据表,所以,在使用他们之前需要在数据库中创建一些表。可以使用一下命令:
python manage.py migrate
创建模型
在 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。
每个 Field 类实例变量的名字(例如 question_text 或 pub_date )也是字段名,我们会在在 Python 代码里使用它们,而数据库会将它们作为列名。
定义Field类需要参数。例如 CharField 需要一个 max_length 参数。这个参数的用处不止于用来定义数据库结构,也用于验证数据。
Field 也能够接收多个可选参数;在上面的例子中:我们将 votes 的 default 也就是默认值,设为0。
最后,我们使用 ForeignKey 定义了一个关系。这将告诉 Django,每个 Choice 对象都关联到一个 Question 对象。Django 支持所有常用的数据库关系:多对一、多对多和一对一。
激活模型
通过上面创建模型,Django可以帮我们做一下几个事情:
1.为应用创建数据库 chemea(生成 CREATE TABLE 语句)。
2.创建可以与 Question 和 Choice 对象进行交互的 Python 数据库 API。
但是前提是我们得先把polls应用安装到我们的项目里面。
可以在INSTALLED_APPS里面加上'polls'或者'polls.apps.PollsConfig'
INSTALLED_APPS = [
'polls.apps.PollsConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
经过上面的操作我们已经注册polls这个应用了,因为我们之前对模型做了一些改变,并且你想要把这些改变保存为 migration。接着运行下面的命令:
python manage.py makemigrations polls
可以看到以下输出:
这个命令是什么意思,做了什么操作呢?我们可以通过一下命令查看
python manage.py sqlmigrate polls 0001
以下就是通过这个命令输出的log
BEGIN;
--
-- Create model Choice
--
CREATE TABLE "polls_choice" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "choice_text" varchar(200) NOT NULL, "votes" integer NOT NULL);
--
-- Create model Question
--
CREATE TABLE "polls_question" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "question_text" varchar(200) NOT NULL, "pub_date" datetime NOT NULL);
--
-- Add field question to choice
--
ALTER TABLE "polls_choice" RENAME TO "polls_choice__old";
CREATE TABLE "polls_choice" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "choice_text" varchar(200) NOT NULL, "votes" integer NOT NULL, "question_id" integer NOT NULL REFERENCES "polls_question" ("id") DEFERRABLE INITIALLY DEFERRED);
INSERT INTO "polls_choice" ("id", "choice_text", "votes", "question_id") SELECT "id", "choice_text", "votes", NULL FROM "polls_choice__old";
DROP TABLE "polls_choice__old";
CREATE INDEX "polls_choice_question_id_c5b4b260" ON "polls_choice" ("question_id");
COMMIT;
从上面可以看出来,是执行了创建数据库表的命令。
以上有几点需要注意:
1.数据库的表名是由应用名(polls)和模型名的小写形式( question 和 choice)连接而来。例如polls_question和polls_choice
2.主键(IDs)会被自动创建
3.Django默认会在外键字段名后追加字符串 "_id"
4.外键关系由 FOREIGN KEY 生成
5.生成的 SQL 语句是为你所用的数据库定制的,所以那些和数据库有关的字段类型,比如 auto_increment (MySQL)、 serial (PostgreSQL)和 integer primary key autoincrement (SQLite),Django 会帮你自动处理。那些和引号相关的事情 - 例如,是使用单引号还是双引号 - 也一样会被自动处理。
6.这个 sqlmigrate 命令并没有真正在你的数据库中的执行迁移 - 它只是把命令输出到屏幕上,让你看看 Django 认为需要执行哪些 SQL 语句
再次执行 migrate 命令,在数据库里创建新定义的模型的数据表
python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, polls, sessions
Running migrations:
Applying polls.0001_initial... OK
综上可以总结一下数据库创建迁移大概需要三个步骤:
1.编辑 models.py 文件,改变模型。
2.运行 python manage.py makemigrations 为模型的改变生成迁移文件。
3.运行 python manage.py migrate 来应用数据库迁移。
数据库操作
首先我们在终端输入命令python manage.py shell,然后关联我们刚才创建的数据库表
操作数据库一般就是增删改查这些操作
增
obj = Question(question_text="What's new?", pub_date=timezone.now())
q.save()
删
q = Question.objects.get(pk=1)
c = q.choice_set.filter(choice_text__startswith='Just hacking')
c.delete()
改
q = Question.objects.get(pk=1)
q.question_text = "How old are you?"
q.save()
查
1.Question.objects.all() 获取全部数据
2.Question.objects.filter(question_text__startswith='What') 获取question_text以'What'开始的数据
3.Question.objects.exclude(question_text__startswith='What') 获取除了question_text以'What'开始的数据
4.Question.objects.get(id=1) 获取id=1的单条数据,不存在则报错(不建议)
这里涉及到我们对models.py的一些修改,如下
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
def __str__(self):
return self.question_text
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)
def __str__(self):
return self.choice_text
介绍 Django 管理页面
首先,我们需要创建一个能登录管理页面的用户。运行下面的命令:
python manage.py createsuperuser
根据提示输入用户名,邮箱和密码就可以创建好账号了,效果如下图
接下来在浏览器中输入http://127.0.0.1:8000/admin/,你就会看见管理员登录界面,通过刚才创建的账号登录,可以看到进入了管理界面,如图
向管理页面中加入我们创建的应用
在polls/admin.py里面添加需要放到我们管理页面的功能,修改polls/admin.py文件
from django.contrib import admin
from .models import Question
admin.site.register(Question)
刷新一下页面,可以看到Question已经在我们的管理列表里面了
点击Question就可以就可以看到对应的管理列表了,可以通过点击“What's up”来编辑这个选项
注意事项:
1.这个表单是从 Question 模型中自动生成的
2.不同的字段类型(日期时间字段 DateTimeField 、字符字段 CharField)会生成对应的 HTML 输入控件。
3.每个日期时间字段 DateTimeField 都有 JavaScript,可以直接选择日期
页面功能:
1.保存(Save) - 保存改变,然后返回对象列表。
2.保存并继续编辑(Save and continue editing) - 保存改变,然后重新载入当前对象的修改界面。
3.保存并新增(Save and add another) - 保存改变,然后添加一个新的空对象并载入修改界面。
4.删除(Delete) - 显示一个确认删除页面。
接下来就可以在编辑界面做相应的增删改查操作了。