这部分链接上一部分。将建立数据库,创建第一个模型,并主要关注 Django 提供的自动生成的管理页面。
打开 mysite/setting.py 文件。这包含了 Django 项目设置的 Python 模块。通常,这个配置文件使用 SQLite 作为默认的数据库。
在此,我只是作为试水,不打算切换数据库。当然有需要的,可以自己去使用一些更具扩展性的数据库,例如 PostgreSQL 等。
如果你想使用其他数据库,你需要安装合适的 database bindings ,然后改变设置文件中 DATABASES
'default'
项目中的一些键值:
ENGINE
-- 可选值有'django.db.backends.sqlite3'
,'django.db.backends.postgresql'
,'django.db.backends.mysql'
,- 或
'django.db.backends.oracle'
。其它 可用后端。 NAME
- 数据库的名称。如果使用的是 SQLite,数据库将是你电脑上的一个文件,在这种情况下,NAME
应该是此文件的绝对路径,包括文件名。默认值os.path.join(BASE_DIR, 'db.sqlite3')
将会把数据库文件储存在项目的根目录。
如果你不使用 SQLite,则必须添加一些额外设置,比如 USER
、 PASSWORD
、 HOST
等等。想了解更多数据库设置方面的内容,请看文档:DATABASES
。
首先创建模型
在 Django 里写一个数据库驱动的 web 应用第一步是定义模型,也就是数据库结构设计和附加的其他元数据。
修改 polls/models.py 添加两个模型,一个是问题,一个是选项。
1 from django.db import models 2 3 4 class Question(models.Model): 5 question_text = models.CharField(max_length=200) 6 pub_date = models.DateTimeField('date published') 7 8 9 class Choice(models.Model): 10 question = models.ForeignKey(Question, on_delete=models.CASCADE) 11 choice_text = models.CharField(max_length=200) 12 votes = models.IntegerField(default=0)
在这里,每个模型都由django的子类表示。 django.db.models.Model
。每个模型都有许多类变量,每个类变量表示模型中的一个数据库字段
每个字段都是 Field
类的实例 - 比如,字符字段被表示为 CharField
,日期时间字段被表示为 DateTimeField
。这将告诉 Django 每个字段要处理的数据类型。
每个 Field
类实例变量的名字(例如 question_text
或 pub_date
)也是字段名,所以最好使用对机器友好的格式。你将会在 Python 代码里使用它们,而数据库会将它们作为列名。
你可以使用可选的选项来为 Field
定义一个人类可读的名字。这个功能在很多 Django 内部组成部分中都被使用了,而且作为文档的一部分。如果某个字段没有提供此名称,
Django 将会使用对机器友好的名称,也就是变量名。在上面的例子中,我们只为 Question.pub_date
定义了对人类友好的名字。对于模型内的其它字段,它们的机器友好名也会被作为人类友好名使用。
定义某些 Field
类实例需要参数。例如 CharField
需要一个 max_length
参数。这个参数的用处不止于用来定义数据库结构,也用于验证数据,我们稍后将会看到这方面的内容。
Field
也能够接收多个可选参数;在上面的例子中:我们将 votes
的 default
也就是默认值,设为0。
注意在最后,我们使用 ForeignKey
定义了一个关系。这将告诉 Django,每个 Choice
对象都关联到一个 Question
对象。Django 支持所有常用的数据库关系:多对一、多对多和一对一。
激活模型
上面的一小段代码给了 Django 很多信息。通过这些信息, Django 为这个应用
1.创建数据库 schema
2.创建可以与 Question(问题)和Choice(选项)对象进行交互的 Python 数据库 API 。
首先,把应用 Polls 安装到项目。
需要在配置类 INSTALLED_APPS
中添加设置。因为应用的 PollsConfig 写在文件 pollsapps.py 中。那么路径:'polls.apps.PollsConfig'
在项目的 setting.py 文件中修改。修改后:
1 INSTALLED_APPS = [ 2 'polls.apps.PollsConfig', 3 'django.contrib.admin', 4 'django.contrib.auth', 5 'django.contrib.contenttypes', 6 'django.contrib.sessions', 7 'django.contrib.messages', 8 'django.contrib.staticfiles', 9 ]
接下来执行命令行:
1 # 通过运行 makemigrations 命令,Django 会检测你对模型文件的修改(在这种情况下,你已经取得了新的),并且把修改的部分储存为一次 迁移。 2 E:workpy_djmysite>python manage.py makemigrations polls 3 Migrations for 'polls': 4 pollsmigrations 001_initial.py 5 - Create model Question 6 - Create model Choice 7 8 # 查看脚本 9 E:workpy_djmysite>python manage.py sqlmigrate polls 0001 10 BEGIN; 11 -- 12 -- Create model Question 13 -- 14 CREATE TABLE "polls_question" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "question_text" varchar(200) NOT NULL, "pub_date" datetime NOT NULL); 15 -- 16 -- Create model Choice 17 -- 18 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); 19 CREATE INDEX "polls_choice_question_id_c5b4b260" ON "polls_choice" ("question_id"); 20 COMMIT; 21 22 #自动执行数据库迁移并同步管理你的数据库结构的命令 23 E:workpy_djmysite>python manage.py migrate 24 Operations to perform: 25 Apply all migrations: admin, auth, contenttypes, polls, sessions 26 Running migrations: 27 Applying contenttypes.0001_initial... OK 28 Applying auth.0001_initial... OK 29 Applying admin.0001_initial... OK 30 Applying admin.0002_logentry_remove_auto_add... OK 31 Applying admin.0003_logentry_add_action_flag_choices... OK 32 Applying contenttypes.0002_remove_content_type_name... OK 33 Applying auth.0002_alter_permission_name_max_length... OK 34 Applying auth.0003_alter_user_email_max_length... OK 35 Applying auth.0004_alter_user_username_opts... OK 36 Applying auth.0005_alter_user_last_login_null... OK 37 Applying auth.0006_require_contenttypes_0002... OK 38 Applying auth.0007_alter_validators_add_error_messages... OK 39 Applying auth.0008_alter_user_username_max_length... OK 40 Applying auth.0009_alter_user_last_name_max_length... OK 41 Applying auth.0010_alter_group_name_max_length... OK 42 Applying auth.0011_update_proxy_permissions... OK 43 Applying polls.0001_initial... OK 44 Applying sessions.0001_initial... OK
注意:migrate 是一个强大的功能,这里没有详细的介绍。大家可以自己去了解。只要记住一下几步:
改变模型需要这三步:
- 编辑
models.py
文件,改变模型。 - 运行
python manage.py makemigrations
为模型的改变生成迁移文件。 - 运行
python manage.py migrate
来应用数据库迁移。
使用 python manage.py shell 命令测试 API 吧!
1 E:workpy_djmysite>python manage.py shell 2 Python 3.7.4 (default, Aug 9 2019, 18:34:13) [MSC v.1915 64 bit (AMD64)] 3 Type 'copyright', 'credits' or 'license' for more information 4 IPython 7.8.0 -- An enhanced Interactive Python. Type '?' for help. 5 6 In [1]: from polls.models import Choice,Question 7 8 In [2]: Question.objects.all() 9 Out[2]: <QuerySet []> 10 11 In [3]: from django.utils import timezone 12 13 In [4]: q = Question(question_text = "What's new?",pub_date = timezone.now()) 14 15 In [5]: q.save() 16 17 In [6]: Question.objects.all() 18 Out[6]: <QuerySet [<Question: Question object (1)>]> 19 20 In [7]: q.id 21 Out[7]: 1
更多的可以自己去尝试:https://docs.djangoproject.com/en/3.0/topics/db/queries/
介绍 Django 管理页面
创建管理员账号
1 #创建账号管理员命令 2 E:workpy_djmysite>py manage.py createsuperuser 3 Username (leave blank to use 'joint'): sailor 4 Email address: sailor@explem.com 5 Password: 6 Password (again): 7 This password is too short. It must contain at least 8 characters. 8 This password is too common. 9 This password is entirely numeric. 10 Bypass password validation and create user anyway? [y/N]: y 11 Superuser created successfully.
这里用户名:sailor password:123456 . 密码安全提示,最后确认创建Y。
创建完毕启动服务:
1 python manage.py runserver
现在,打开浏览器,转到你本地域名的 "/admin/" 目录, -- 比如 "http://127.0.0.1:8000/admin/" 。你应该会看见管理员登录界面:
登录
添加自己的应用
修改 polls/admin.py 注册应用
1 from django.contrib import admin 2 3 from .models import Question 4 5 admin.site.register(Question)
刷新页面,开始便捷的可视化操作。