注意:
文中的 python 系统名、mysite 项目、user 应用 ourCla 类和 Student 类只是站主在本次操作中随意取的名称,读者可以根据自己的喜好换成任意别的名称
正文:
步骤目录:
步骤一:系统环境要求
步骤二:安装 Django
2.1 安装 Python3
2.2 创建并进入 Django 项目的目录
2.3 将 Django 项目的目录指定为 Django 环境
2.4 进入 Django 环境
步骤三:创建 mysite 项目
3.1 创建 mysite 项目
3.2 mysite 项目的目录
3.2.1 安装 tree 目录显示软件
3.2.2 显示 mysite 项目的目录
3.2.3 Django 项目目录介绍
步骤四:创建 user 应用
4.1 创建 user 应用
4.2 user 应用的目录
4.2.1 显示 user 应用的目录
4.2.2 Django 应用目录介绍
4.3 在 mysite 应用中导入 user 应用
步骤五:实现连接 MariaDB 数据库
5.1 安装 MairaDB 数据库和客户端
5.2 创建用于 Django 的 MairaDB 的库和用户
5.2.1 进入 MairaDB 数据库
5.2.2 创建用于 Django 的库
5.2.3 创建用于 Django 的用户
5.2.4 刷新权限
5.3 退出 MariaDB 数据库
5.4 重启 MariaDB
步骤六:搭建用于 Django 的 MariaDB 数据库环境
6.1 安装 Django 连接 MariaDB 的模块
6.2 在 mysite 应用中添加 Django 连接 MariaDB 的模块
6.3 在 user 应用数据库模板中添加 ourCla 类和 Student 类
6.4 在 mysite 应用中设置连接到 MariaDB 数据库
6.5 生成牵引文件
6.6 将牵引文件导入 MariaDB 数据库
6.7 查看导入到 MariaDB 数据库的表
6.7.1 进入 MariaDB 数据库
6.7.2 查看所有的库
6.7.3 进入 user 库
6.7.4 查看 user 库里所有的表
6.7.5 查看 user_ourcla 表和 user_student 表里的数据
6.7.6 查看 user_ourcla 表和 user_student 表的表结构
6.7.7 退出 MariaDB 数据库
步骤七:测试 Django 一对多多表
7.1 配置 Django 环境
7.1.1 进入 Python 环境
7.1.2 引入 os 模块和 django 模块
7.1.3 调用 mysite.settings 的配置
7.1.4 让刚刚的调用生效
7.1.5 调用 mysite 项目 user 应用 models 模块里的所有内容
7.2 插入一对多多表数据
7.2.1 往 ourCla 表插入两条数据(插入两条班级数据)
7.2.2 往 Student 表插入三条数据(插入三条学生数据)
7.3 查看一对多多表数据
7.3.1 查看一对多多表数据的性质
7.3.2 正向查询数据
7.3.3 逆向查询数据
7.4 使用对象插入一对多多表数据
7.4.1 创建一个对象再插入数据
7.4.2 使用对象插入一对多多表数据
具体的操作步骤:
步骤一:系统环境要求
1) 服务器的系统需要是 openSUSE 15.2 版本
2) 服务器要关闭防火墙
3) 服务器系统要配置好可用的软件源(最好是软件数量最多的官方版本)
4) 服务器要能够连接外网
步骤二:安装 Django
2.1 安装 Python3
[root@python ~]# zypper -n install python3
2.2 创建并进入 Django 项目的目录
[root@python ~]# mkdir project
[root@python ~]# cd project
2.3 将 Django 项目的目录指定为 Django 环境
[root@python project]# python3 -m venv django_env
2.4 进入 Django 环境
[root@python project]# source django_env/bin/activate
(django_env) [root@python project]# pip install django
(补充:在此次操作发生时,最新的 Django 版本是 3.2)
步骤三:创建 mysite 项目
3.1 创建 mysite 项目
(django_env) [root@python project]# django-admin startproject mysite
3.2 mysite 项目的目录
3.2.1 安装 tree 目录显示软件
(django_env) [root@python project]# zypper -n install tree
3.2.2 显示 mysite 项目的目录
(django_env) [root@python project]# cd mysite
(django_env) [root@python mysite]# tree
.
├── manage.py
└── mysite
├── __init__.py
├── asgi.py
├── settings.py
├── urls.py
└── wsgi.py
1 directory, 5 files
3.2.3 Django 项目目录介绍
1) mysite 此 Django 项目的容器
2) manage.py 命令行工具,与 Django 项目进行交互
3) mysite/__init__.py 空文件,通知 Python 此项目是一个 Python 包
4) mysite/settings.py 此 Django 项目的配置文件
5) mysite/urls.py 此 Django 项目的 URL 声明和 Django 的网站“目录”
6) mysite/wsgi.py WSGI 兼容 Web 服务器的入口
步骤四:创建 user 应用
4.1 创建 user 应用
(django_env) [root@python mysite]# django-admin startapp user
4.2 user 应用的目录
4.2.1 显示 user 应用的目录
(django_env) [root@python mysite]# tree
.
├── manage.py
├── mysite
│ ├── __init__.py
│ ├── asgi.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── user
├── __init__.py
├── admin.py
├── apps.py
├── migrations
│ └── __init__.py
├── models.py
├── tests.py
└── views.py
3 directories, 13 files
4.2.2 Django 应用目录介绍
1) user/app.py 此 Django 应用的容器
2) user/__init__.py 空文件,通知 python 此项目是一个 python 包
3) user/admin.py 此 Django 应用自带的后台管理相关的类
4) user/app.py 此 Django 应用指定应用名的文件
5) user/migrations.py 此 Django 应用通过 python 代码生成数据库表时里面会产生一些迁移文件
6) user/models.py 可以在里面创建一些 Python 对象并通过这些对象在数据库里创建对应的表
7) user/test.py 此 Django 应用的测试文档
8) user/views.py 此 Django 应用的视图,接收前端数据,把数据传递给后端,响应相关页面
4.3 在 mysite 应用中导入 user 应用
在 mysite/mysite/settings.py 中添加以下内容:
......
INSTALLED_APPS = [
......
'user',
]
......
步骤五:实现连接 MariaDB 数据库
5.1 安装 MairaDB 数据库和客户端
(django_env) [root@python mysite]# zypper -n install mariadb mariadb-devel mariadb-server mariadb-client
5.2 创建用于 Django 的 MairaDB 的库和用户
5.2.1 进入 MairaDB 数据库
(django_env) [root@python mysite]# mysql -h 127.0.0.1 -p
5.2.2 创建用于 Django 的库
MariaDB [(none)]> create database user;
(补充:这里以创建 user 库为例)
5.2.3 创建用于 Django 的用户
MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
(补充:这里以创建 root 用户,密码是 password 为例)
5.2.4 刷新权限
MariaDB [(none)]> flush privileges;
5.3 退出 MariaDB 数据库
MariaDB [(none)]> exit
5.4 重启 MariaDB
(django_env) [root@python mysite]# systemctl restart mariadb
步骤六:搭建用于 Django 的 MariaDB 数据库环境
6.1 安装 Django 连接 MariaDB 的模块
(django_env) [root@python mysite]# pip3 install hexdump
(django_env) [root@python mysite]# pip3 install pymysql
6.2 在 mysite 应用中添加 Django 连接 MariaDB 的模块
在 mysite/mysite/__init__.py 中添加以下内容:
import pymysql
pymysql.install_as_MySQLdb()
6.3 在 user 应用数据库模板中添加 ourCla 类和 Student 类
在 mysite/user/models.py 中添加以下内容:
......
# Class table, main table, unique
class ourCla(models.Model):
cno = models.AutoField(primary_key=True)
cname = models.CharField(max_length=30)
# Student table, subordinate table, not unique
class Student(models.Model):
sno = models.AutoField(primary_key=True)
sname = models.CharField(max_length=30)
cno = models.ForeignKey(ourCla,on_delete=models.CASCADE)
def __str__(self):
return u'Student:%s'%self.sname
(
补充:
1) 这里的这条语句会让 Student 类中 sname 字段以 Student: 的列表形式显示出来:
def __str__(self):
return u’Student:%s’%self.sname
2) 这里的 CASCADE 是指级连,默认就算这里没写也会有,它是引用不用加括号
3) 这里 ourCla 的数据是唯一的,所以 ourCla 是主表
4) 这里外键在 Student 表里,所以 Student 是从表
)
6.4 在 mysite 应用中设置连接到 MariaDB 数据库
将 mysite/mysite/settings.py 中的以下内容:
......
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
......
修改为:
......
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'user',
'HOST': '127.0.0.1',
'PORT': '3306',
'USER': 'root',
'PASSWORD': 'password',
}
}
......
(
补充:这里以
1) 使用的库是 user
2) 使用的服务器是 127.0.0.1
3) 使用的端口是 3306
4) 使用的用户是 root
5) 使用的密码是 password
为例
)
6.5 生成牵引文件
(django_env) [root@python mysite]# python3 manage.py makemigrations
Migrations for 'user':
user/migrations/0001_initial.py
- Create model ourCla
- Create model Student
6.6 将牵引文件导入 MariaDB 数据库
(django_env) [root@python mysite]# python3 manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, post, 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 post.0001_initial... OK
Applying sessions.0001_initial... OK
6.7 查看导入到 MariaDB 数据库的表
6.7.1 进入 MariaDB 数据库
(django_env) [root@python mysite]# mysql -uroot -p
6.7.2 查看所有的库
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| user |
+--------------------+
4 rows in set (0.001 sec)
6.7.3 进入 user 库
MariaDB [(none)]> use user;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
6.7.4 查看 user 库里所有的表
MariaDB [user]> show tables;
+----------------------------+
| Tables_in_user |
+----------------------------+
| auth_group |
| auth_group_permissions |
| auth_permission |
| auth_user |
| auth_user_groups |
| auth_user_user_permissions |
| django_admin_log |
| django_content_type |
| django_migrations |
| django_session |
| user_ourcla |
| user_student |
+----------------------------+
12 rows in set (0.002 sec)
6.7.5 查看 user_ourcla 表和 user_student 表里的数据
MariaDB [user]> select * from user_ourcla;
Empty set (0.001 sec)
MariaDB [user]> select * from user_student;
Empty set (0.001 sec)
6.7.6 查看 user_ourcla 表和 user_student 表的表结构
MariaDB [user]> desc user_ourcla;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| cno | int(11) | NO | PRI | NULL | auto_increment |
| cname | varchar(30) | NO | | NULL | |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.006 sec)
MariaDB [user]> desc user_student;
+--------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+----------------+
| sno | int(11) | NO | PRI | NULL | auto_increment |
| sname | varchar(30) | NO | | NULL | |
| cno_id | int(11) | NO | MUL | NULL | |
+--------+-------------+------+-----+---------+----------------+
3 rows in set (0.002 sec)
6.7.7 退出 MariaDB 数据库
MariaDB [(user)]> quit();
步骤七:测试 Django 一对多多表
7.1 配置 Django 环境
7.1.1 进入 Python 环境
(django_env) [root@python mysite]# python3
7.1.2 引入 os 模块和 django 模块
>>> import os,django
7.1.3 调用 mysite.settings 的配置
>>> os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
'mysite.settings'
7.1.4 让刚刚的调用生效
>>> django.setup()
7.1.5 调用 mysite 项目 user 应用 models 模块里的所有内容
>>> from user.models import *
7.2 插入一对多多表数据
7.2.1 往 ourCla 表插入两条数据(插入两条班级数据)
>>> cla = ourCla.objects.create(cname='classone')
>>> cla1 = ourCla.objects.create(cname='classtwo')
(补充:这里以随意插入两条数据为例)
7.2.2 往 Student 表插入三条数据(插入三条学生数据)
>>> Student.objects.create(sname='zhangsan',cno=cla)
<Student: Student:zhangsan>
>>> Student.objects.create(sname='lisi',cno=cla)
<Student: Student:lisi>
>>> Student.objects.create(sname='Wangwu',cno=cla1)
<Student: Student:Wangwu>
(
补充:
1) 这里以随意插入三条数据为例
2) zhangsan 和 lisi 的 cno 与 7.2.1 中 cla 的相同
3) Wangwu 的 cno 与 7.2.1 中 cla1 的相同
)
7.3 查看一对多多表数据
7.3.1 查看一对多多表数据的性质
1) 这里从 ourCla 表到 Student 表的查询正向查询
2) 这里从 Student 表到 ourCla 表的查询逆向查询
3) 这里 ourCla 是主表,数据是唯一的
4) 这里 Student 是从表,有外键
7.3.2 正向查询数据
>>> ourCla.objects.first().student_set.all()
<QuerySet [<Student: Student:zhangsan>, <Student: Student:lisi>]>
(补充:这里的 _set 代表一对多,有一对多的就会有 _set)
7.3.3 逆向查询数据
>>> Student.objects.first().cno
<ourCla: ourCla object (1)>
7.4 使用对象插入一对多多表数据
7.4.1 创建一个插入数据的对象
>>> def insertData(claname,*snames):
... try:
... cla = ourCla.objects.get(cname=claname)
... except ourCla.DoesNotExist:
... cla = ourCla.objects.create(cname=claname)
... for sn in snames:
... try:
... stu = Student.objects.get(sname=sn)
... except Student.DoesNotExist:
... Student.objects.create(sname=sn,cno=cla)
...
(
补充:
1) 这里的星号 “*” 代表一个可变参数
2) 一个星号 “*” 代表是一个元组的形势,各个元素单独存在且用逗号隔开
3) 两个星号 “**” 代表是一个键值对,用 <key>=<value> 的方式存在且用逗号隔开
)
7.4.2 使用对象插入一对多多表数据
>>> insertData('classthree','studentone','studenttwo')
(
补充:结合 7.4.1 这里以
1) 在 Student 表中插入 studentone 数据和 studenttwo 数据
2) 在 ourCla 表中插入 classthree 数据
3) studentone 数据和 studenttwo 数据都对应 classthree 数据
为例
)