内容一:一对一关系
1.1 通常实现方法
唯一外键
1.2 典型案例
学生表和学生证表
内容二:一对多关系
2.1 通常实现方法
主外键
2.2 典型案例
学生表和班级表
内容三:多对多关系
3.1 通常实现方法
中间表加联合主键
(补充:联合主键是指一张表中有两个主键,这两个主键叫联合主键,每一条数据里的联合主键可以相互之间拼凑成一个新的主键,联合主键可以重复,只要保证这个新的主键唯一即可)
3.2 典型案例
学生和课程
唯一外键
学生表和学生证表
主外键
学生表和班级表
中间表加联合主键
(补充:联合主键是指一张表中有两个主键,这两个主键叫联合主键,每一条数据里的联合主键可以相互之间拼凑成一个新的主键,联合主键可以重复,只要保证这个新的主键唯一即可)
学生和课程
删除此文件:
<Django project>.<Django app>.migrations.0001_inital.py
在数据库里删除以下模版里自定义生成的表:
<Django project>.<Django app>.models.py
在数据库中删除以下表中:
django_migrations
的以下数据
0001_initial
(步骤略)
文中的 python 系统名、mysite 项目、post 应用和 Post 类只是站主在本次操作中随意取的名称,读者可以根据自己的喜好换成任意别的名称
1) 服务器的系统需要是 openSUSE 15.2 版本
2) 服务器要关闭防火墙
3) 服务器系统要配置好可用的软件源(最好是软件数量最多的官方版本)
4) 服务器要能够连接外网
[root@python ~]# zypper -n install python3
(补充:在此次操作发生时,最新的 python 版本是 3.6.12)
[root@python ~]# mkdir project
[root@python ~]# cd project
[root@python project]# python3 -m venv django_env
[root@python project]# source django_env/bin/activate
(django_env) [root@python project]# pip install django
(补充:在此次操作发生时,最新的 Django 版本是 3.2)
(django_env) [root@python project]# django-admin startproject mysite
(django_env) [root@python project]# zypper -n install tree
(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
1) mysite 此 Django 项目的容器
2) manage.py 命令行工具,与 Django 项目进行交互
3) mysite/__init__.py 空文件,通知 Python 此项目是 1 个 Python 包
4) mysite/settings.py 此 Django 项目的配置文件
5) mysite/urls.py 此 Django 项目的 URL 声明和 Django 的网站“目录”
6) mysite/wsgi.py WSGI 兼容 Web 服务器的入口
(django_env) [root@python mysite]# django-admin startapp post
(django_env) [root@python mysite]# tree
.
├── manage.py
├── mysite
│ ├── __init__.py
│ ├── asgi.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── post
├── __init__.py
├── admin.py
├── apps.py
├── migrations
│ └── __init__.py
├── models.py
├── tests.py
└── views.py
3 directories, 13 files
1) movies/app.py 此 Django 应用的容器
2) movies/__init__.py 空文件,通知 python 此项目是 1 个 Python 包
3) movies/admin.py 此 Django 应用自带的后台管理相关的类
4) movies/app.py 此 Django 应用指定应用名的文件
5) movies/migrations.py 此 Django 应用通过 python 代码生成数据库表时里面会产生一些迁移文件
6) movies/models.py 可以在里面创建一些 Python 对象并通过这些对象在数据库里创建对应的表
7) movies/test.py 此 Django 应用的测试文档
8) movies/views.py 此 Django 应用的视图,接收前端数据,把数据传递给后端,响应相关页面
在 mysite/mysite/settings.py 中添加以下内容:
INSTALLED_APPS = [
'post',
]
(django_env) [root@python mysite]# zypper -n install mariadb mariadb-devel mariadb-server mariadb-client
(django_env) [root@python mysite]# mysql -h 127.0.0.1 -p
MariaDB [(none)]> create database post;
(补充:这里以创建 post 库为例)
MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
(补充:这里以创建 root 用户,密码是 password 为例)
MariaDB [(movies)]> flush privileges;
MariaDB [(none)]> exit
(django_env) [root@python mysite]# systemctl restart mariadb
(django_env) [root@python mysite]# pip3 install hexdump
(django_env) [root@python mysite]# pip3 install pymysql
在 mysite/mysite/__init__.py 中添加以下内容:
......
import pymysql
pymysql.install_as_MySQLdb()
在 mysite/users/models.py 中添加以下内容:
......
class Post(models.Model):
pid = models.AutoField(primary_key=True)
title = models.CharField(max_length=100,unique=True)
content = models.TextField()
create = models.DateTimeField(auto_now_add=True)
modified = models.DateTimeField(auto_now_add=True)
email = models.EmailField()
isdelete = models.BooleanField(default=False)
access_count = models.PositiveIntegerField()
price = models.DecimalField(max_digits=5,decimal_places=2)
file = models.ImageField(upload_to='upload/images')
def __str__(self):
return u'Post:%s,%s’%(self.title,self.access_count)
class Meta:
db_table = 't_post'
(
补充:
1) 如果在 create = models.DateTimeField(auto_now_add=True) 和 modified = models.DateTimeField(auto_now_add=True) 中删除了 auto_now_add=True,则它们可以直接在后端管理页面里显示了,否则的话它们只会在后端自动生成而不显示
2) 这里的这条语句会让 Post 类中 title 字段和 access_count 字段以 Post:<title value>,<access_count value> 的列表形式显示出来:
def __str__(self):
return u'Post:%s,%s’%(self.title,self.access_count)
3) 这里的这条语句会将表明指定为 t_post
class Meta:
db_table = 't_post'
)
(django_env) [root@python mysite]# pip3 install Pillow
将 mysite/mysite/settings.py 中的以下内容:
......
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
......
修改为:
......
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'post',
'HOST': '127.0.0.1',
'PORT': '3306',
'USER': 'root',
'PASSWORD': 'password',
}
}
......
(
补充:这里以
1) 使用的库是 post
2) 使用的服务器是 127.0.0.1
3) 使用的端口是 3306
4) 使用的用户是 root
5) 使用的密码是 password
为例
)
(django_env) [root@python mysite]# python3 manage.py makemigrations
Migrations for 'post':
post/migrations/0001_initial.py
- Create model Post
(补充:这里以将 users 应用的 model 模块转换成牵引文件为例)
(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
(django_env) [root@python mysite]# mysql -uroot -h127.0.0.1 -p
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| post |
+--------------------+
4 rows in set (0.001 sec)
MariaDB [(post)]> use post;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
MariaDB [(post)]> show tables;
+----------------------------+
| Tables_in_test |
+----------------------------+
| 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 |
| t_post |
+----------------------------+
11 rows in set (0.001 sec)
MariaDB [(post)]> select * from t_post;
Empty set (0.001 sec)
MariaDB [(post)]> desc t_post;
+--------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+------------------+------+-----+---------+----------------+
| pid | int(11) | NO | PRI | NULL | auto_increment |
| title | varchar(100) | NO | UNI | NULL | |
| content | longtext | NO | | NULL | |
| create | datetime(6) | NO | | NULL | |
| modified | datetime(6) | NO | | NULL | |
| email | varchar(254) | NO | | NULL | |
| isdelete | tinyint(1) | NO | | NULL | |
| access_count | int(10) unsigned | NO | | NULL | |
| price | decimal(5,2) | NO | | NULL | |
| file | varchar(100) | NO | | NULL | |
+--------------+------------------+------+-----+---------+----------------+
10 rows in set (0.006 sec)
MariaDB [(post)]> quit();
在 mysite/users/admin.py 中添加以下内容:
......
from .models import Post
admin.site.register(Post)
(补充:这里以导入 models 的 Post 类为例)
在 mysite/mysite/settings.py 中将以下内容:
......
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
......
修改为:
......
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'
......
(补充:这里设置语言为汉语,时区为上海为例)
(django_env) [root@python mysite]# python3 manage.py createsuperuser
Username (leave blank to use 'root'): eternalcenter
Email address: eternalcenter@eternalcenter.com
Password:
Password (again):
This password is too short. It must contain at least 8 characters.
This password is too common.
This password is entirely numeric.
Bypass password validation and create user anyway? [y/N]: y
Superuser created successfully.
(django_env) [root@python mysite]# python3 manage.py runserver
1) 打开网页:
http://127.0.0.1:8000/admin/
2) 使用创建的 admin 模块的用户登录
3) 点击 Posts 后面的 “增加”
4) 可以看见刚刚创建的表格,并可以进行数据操作
直接通过命令行使用 Ansible 命令
将 Ansible 里的内容写入到 Playbook 里,执行 Playbook,Playbook 类似于 1 个脚本
制作 1 个 Ansible role,之后在 Playbook 里调用 role,一次性调用多个 role 时可以用分号 “;” 相隔,role 类似于 1 个自定义的模块
# python3
>>> import uuid
>>> uuid.uuid4()
>>> uuid.uuid4().get_hex()