[实验] Django 单表数据的操作 (通过自带应用 admin 实现) (MariaDB版)

注意:

文中的 python 系统名、mysite 项目、post 应用和 Post 类只是站主在本次操作中随意取的名称,读者可以根据自己的喜好换成任意别的名称

正文:

步骤一:系统环境要求

1) 服务器的系统需要是 openSUSE 15.2 版本
2) 服务器要关闭防火墙
3) 服务器系统要配置好可用的软件源(最好是软件数量最多的官方版本)
4) 服务器要能够连接外网

步骤二:安装 Django

2.1 安装 Python3

[root@python ~]# zypper -n install python3

(补充:在此次操作发生时,最新的 python 版本是 3.6.12)

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.3.3 Django 项目目录介绍

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 服务器的入口

步骤四:创建 post 应用

4.1 创建 post 应用

(django_env) [root@python mysite]# django-admin startapp post

4.2 post 应用的目录

4.2.1 显示 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
4.2.2 Django 应用目录介绍

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 应用的视图,接收前端数据,把数据传递给后端,响应相关页面

4.3 在 mysite 应用中导入 post 应用

在 mysite/mysite/settings.py 中添加以下内容:

INSTALLED_APPS = [
    'post',
]

步骤五:搭建用于 Django 的 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 post;

(补充:这里以创建 post 库为例)

5.2.3 创建用于 Django 的用户
MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;

(补充:这里以创建 root 用户,密码是 password 为例)

5.2.4 刷新权限
MariaDB [(movies)]> flush privileges;

5.3 退出 MariaDB 数据库

MariaDB [(none)]> exit

5.4 重启 MariaDB

(django_env) [root@python mysite]# systemctl restart mariadb

步骤六:实现连接 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 在 post 应用数据库模板中添加 Post 类

6.3.1 在 post 应用数据库模板中添加 Post 类

在 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'

6.3.2 安装 models.ImageField 字段所需模块
(django_env) [root@python mysite]# pip3 install Pillow

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': '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
为例

6.5 生成牵引文件

(django_env) [root@python mysite]# python3 manage.py makemigrations
Migrations for 'post':
  post/migrations/0001_initial.py
    - Create model Post

(补充:这里以将 users 应用的 model 模块转换成牵引文件为例)

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 -h127.0.0.1 -p
6.7.2 查看所有的库
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| post               |
+--------------------+
4 rows in set (0.001 sec)
6.7.3 进入 post 库
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
6.7.4 查看 test 库里所有的表
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)
6.7.5 查看 t_post 表里的数据
MariaDB [(post)]> select * from t_post;
Empty set (0.001 sec)
6.7.6 查看 t_post 表的表结构
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)
6.7.7 退出 MariaDB 数据库
MariaDB [(post)]> quit();

步骤七:设置 admin 应用

7.1 在 Django 自带的 admin 应用中导入数据库模版中的 post 类

在 mysite/users/admin.py 中添加以下内容:

......
from .models import Post

admin.site.register(Post)

(补充:这里以导入 models 的 Post 类为例)

7.2 设置 admin 应用的语言和时区

在 mysite/mysite/settings.py 中将以下内容:

......
LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'
......

修改为:

......
LANGUAGE_CODE = 'zh-Hans'

TIME_ZONE = 'Asia/Shanghai'
......

(补充:这里设置语言为汉语,时区为上海为例)

7.3 创建 admin 应用的账号

(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 服务

(django_env) [root@python mysite]# python3 manage.py runserver

步骤九:使用 admin 应用操作数据

1) 打开网页:

http://127.0.0.1:8000/admin/

2) 使用创建的 admin 模块的用户登录
3) 点击 Posts 后面的 “增加”
4) 可以看见刚刚创建的表格,并可以进行数据操作

[内容] Django 单表数据的查询 (MariaDB 版)

注意:

1) 在增加 Django MariaDB&MySQL 数据之前要先创建连接了 MariaDB 数据库或 MySQL 数据库的 Django 项目

2) 对于本文而言,必须要先完成内容一里的内容,再完成内容二里的内容,才能继续完成内容三里的内容

正文:

内容一:配置 Django 环境

1.1 进入 Python 环境

(django_env) [root@python mysite]# python3

1.2 引入 os 模块和 django 模块

>>> import os,django

1.3 调用 mysite.settings 的配置

>>> os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
'mysite.settings'

1.4 让刚刚的调用生效

>>> django.setup()

1.5 调用 mysite 项目 movies 应用 models 模块里的所有内容

>>> from movies.models import *

内容二:设置 1 个显示上 1 句 SQL 语句的函数

>>> def showsql():
...     from django.db import connection
...     print(connection.queries[-1]['sql'])

(补充:这里的 [-1] 是指显示上 1 条操作的 SQL 语句)

内容三:Django MariaDB&MySQL 单条数据的条件查询(有可能 1 次性查出多条数据)

3.1 方法一

3.1.1 方法一查询某条数据的操作
>>> Movies.objects.get(mid=2)
<Movies: Movies object (2)>

(补充:这里以查询 movies 表中 mid 字段的值为 2 的数据为例)

3.1.2 显示方法一查询某条数据的 SQL 语句
>>> showsql()
SELECT `movies`.`mid`, `movies`.`mname`, `movies`.`mdesc`, `movies`.`mimg`, `movies`.`mlink` FROM `movies` WHERE `movies`.`mid` = 2 LIMIT 21

(补充:这里以查询 movies 表中 mid 字段的值为 2 的数据为例)

3.2 方法二

3.2.1 方法二查询某条数据的操作
>>> Movies.objects.filter(mname__exact='Titanic')
<QuerySet [<Movies: Movies object (1)>]>

(补充:这里以查询 movies 表中 mname 字段的值精确为 Titanic 的数据为例)

3.2.2 显示方法二查询某条数据的 SQL 语句
>>> showsql()
SELECT `movies`.`mid`, `movies`.`mname`, `movies`.`mdesc`, `movies`.`mimg`, `movies`.`mlink` FROM `movies` WHERE `movies`.`mname` = 'Titanic' LIMIT 21

(补充:这里以查询 movies 表中 mname 字段的值精确为 Titanic 的数据为例)

3.3 方法三

3.3.1 方法三查询某条数据的操作
>>> Movies.objects.filter(mname='titanic')
<QuerySet [<Movies: Movies object (1)>]>

(补充:这里以查询 movies 表中 mname 字段的值为 titanic 的数据为例)

3.3.2 方法三查询某条数据的 SQL 语句
>>> showsql()
SELECT `movies`.`mid`, `movies`.`mname`, `movies`.`mdesc`, `movies`.`mimg`, `movies`.`mlink` FROM `movies` WHERE `movies`.`mname` = 'titanic' LIMIT 21

(补充:这里以查询 movies 表中 mname 字段的值为 titanic 的数据为例)

内容四:Django MariaDB&MySQL 单条数据的精准查询

4.1 查询第 1 条数据

4.1.1 查询第 1 条数据的操作
>>> Movies.objects.first()
<Movies: Movies object (1)>

(补充:这里以查询 movies 表中第一条数据为例)

4.1.2 显示查询第 1 条数据的 SQL 语句
>>> showsql()
SELECT `movies`.`mid`, `movies`.`mname`, `movies`.`mdesc`, `movies`.`mimg`, `movies`.`mlink` FROM `movies` ORDER BY `movies`.`mid` ASC LIMIT 1

(补充:这里以查询 movies 表中第一条数据为例)

4.2 查询最后 1 条数据

4.2.1 查询最后 1 条数据的操作
>>> Movies.objects.last()
<Movies: Movies object (5)>

(补充:这里以查询 movies 表中最后一条数据为例)

4.2.2 显示查询最后 1 条数据的 SQL 语句
>>> showsql()
SELECT `movies`.`mid`, `movies`.`mname`, `movies`.`mdesc`, `movies`.`mimg`, `movies`.`mlink` FROM `movies` ORDER BY `movies`.`mid` DESC LIMIT 1

(补充:这里以查询 movies 表中最后 1 条数据为例)

内容五:Django MariaDB&MySQL 多条数据的条件查询(有可能一次只查出一条数据)

5.1 Django MariaDB&MySQL 多条数据的字符串条件查询(有可能 1 次只查出 1 条数据)

5.1.1 查询包含某些字符串的数据
5.1.1.1 查询包含某些字符串的数据的操作
>>> Movies.objects.filter(mname__contains='it')
<QuerySet [<Movies: Movies object (1)>]>

(补充:这里以查询 movies 表中 mname 字段的值包含 it 字符串的所有数据为例)


注意:
1) 这里需要区分大小写
2) 这里的 mname__contains= 在 mname 和 contains 之间有两个下横线 “_”

5.1.1.2 显示查询包含某些信息的数据的 SQL 语句
>>> showsql()
SELECT `movies`.`mid`, `movies`.`mname`, `movies`.`mdesc`, `movies`.`mimg`, `movies`.`mlink` FROM `movies` WHERE `movies`.`mname` LIKE BINARY '%it%' LIMIT 21

(补充:这里以查询 movies 表中 mname 字段的值包含 it 字符串的所有数据为例)

5.1.2 查询包含某些字符串且不包含另某字符串的数据
5.1.2.1 查询包含某些字符串且不包含另某些字符串的数据的操作
>>> Movies.objects.filter(mname__contains='Car').exclude(mname__contains='Tit')
<QuerySet [<Movies: Movies object (4)>]>

(补充:这里以查询 movies 表中 mname 字段的值包含 Car 字符串但不包含 Tit 字符串的所有数据为例)


注意:
1) 这里需要区分大小写
2) 这里的 mname__contains= 在 mname 和 contains 之间有两个下横线 “_”

5.1.2.2 显示包含某些字符串且不包含某些字符串的数据的 SQL 语句
>>> showsql()
SELECT `movies`.`mid`, `movies`.`mname`, `movies`.`mdesc`, `movies`.`mimg`, `movies`.`mlink` FROM `movies` WHERE (`movies`.`mname` LIKE BINARY '%Car%' AND NOT (`movies`.`mname` LIKE BINARY '%Tit%')) LIMIT 21

(补充:这里以查询 movies 表中 mname 字段的值包含 Car 字符串且不包含 Tit 字符串的所有数据为例)

5.2 Django MariaDB&MySQL 多条数据的数值比较条件查询(有可能 1 次只查出 1 条数据)

5.2.1 查询大于某个数值的数据
5.2.1.1 查询大于某个数值的数据的操作
>>> Movies.objects.filter(mid__gt='2')
<QuerySet [<Movies: Movies object (3)>, <Movies: Movies object (4)>, <Movies: Movies object (5)>]>

(补充:这里以查询 movies 表中 mid 字段的值大于 2 的所有数据为例)


注意:
1) 这里需要区分大小写
2) 这里的 mid__gt= 在 mid 和 gt 之间有两个下横线 “_”

5.2.1.2 显示查询大于某个数值的数据的 SQL 语句
>>> showsql()
SELECT `movies`.`mid`, `movies`.`mname`, `movies`.`mdesc`, `movies`.`mimg`, `movies`.`mlink` FROM `movies` WHERE `movies`.`mid` > 2 LIMIT 21

(补充:这里以查询 movies 表中 mid 字段的值大于 2 的所有数据为例)

5.2.2 查询大于等于某个数值的数据
5.2.2.1 查询大于等于某个数值的数据的操作
>>> Movies.objects.filter(mid__gte='2')
<QuerySet [<Movies: Movies object (2)>, <Movies: Movies object (3)>, <Movies: Movies object (4)>, <Movies: Movies object (5)>]>

(补充:这里以查询 movies 表中 mid 字段的值大于等于 2 的所有数据为例)


注意:
1) 这里需要区分大小写
2) 这里的 mid__gte= 在 mid 和 gte 之间有两个下横线 “_”

5.2.2.2 显示查询大于等于某个数值的数据的 SQL 语句
>>> showsql()
SELECT `movies`.`mid`, `movies`.`mname`, `movies`.`mdesc`, `movies`.`mimg`, `movies`.`mlink` FROM `movies` WHERE `movies`.`mid` >= 2 LIMIT 21

(补充:这里以查询 movies 表中 mid 字段的值大于等于 2 的所有数据为例)

5.2.3 查询小于某个数值的数据
5.2.3.1 查询小于某个数值的数据的操作
>>> Movies.objects.filter(mid__lt='2')
<QuerySet [<Movies: Movies object (1)>]>

(补充:这里以查询 movies 表中 mid 字段的值小于 2 的所有数据为例)


注意:
1) 这里需要区分大小写
2) 这里的 mid__lt= 在 mid 和 lt 之间有两个下横线 “_”

5.2.3.2 显示查询小于某个数值的数据的 SQL 语句
>>> showsql()
SELECT `movies`.`mid`, `movies`.`mname`, `movies`.`mdesc`, `movies`.`mimg`, `movies`.`mlink` FROM `movies` WHERE `movies`.`mid` < 2 LIMIT 21

(补充:这里以查询 movies 表中 mid 字段的值小于 2 的所有数据为例)

5.2.4 查询小于等于某个数值的数据
5.2.4.1 查询小于等于某个数值的数据的操作
>>> Movies.objects.filter(mid__lte='2')
<QuerySet [<Movies: Movies object (1)>, <Movies: Movies object (2)>]>

(补充:这里以查询 movies 表中 mid 字段的值小于等于 2 的所有数据为例)


注意:
1) 这里需要区分大小写
2) 这里的 mid__lt= 在 mid 和 lt 之间有两个下横线 “_”

5.2.4.2 显示查询小于等于某个数值的数据的 SQL 语句
>>> showsql()
SELECT `movies`.`mid`, `movies`.`mname`, `movies`.`mdesc`, `movies`.`mimg`, `movies`.`mlink` FROM `movies` WHERE `movies`.`mid` <= 2 LIMIT 21

(补充:这里以查询 movies 表中 mid 字段的值小于等于 2 的所有数据为例)

5.2.5 查询包含某个数值或另 1 个数值的数据
5.2.5.1 查询包含某个数值或另 1 个数值的操作
>>> Movies.objects.filter(mid__in=(2,4))
<QuerySet [<Movies: Movies object (2)>, <Movies: Movies object (4)>]>

(补充:这里以查询 movies 表中 mid 字段的值为 2 或者为 4 的数据为例)


注意:
1) 这里需要区分大小写
2) 这里的 mid__in= 在 mid 和 in 之间有两个下横线 “_”

5.2.5.2 查询包含某个数值或另 1 个数值的 SQL 语句
>>> showsql()
SELECT `movies`.`mid`, `movies`.`mname`, `movies`.`mdesc`, `movies`.`mimg`, `movies`.`mlink` FROM `movies` WHERE `movies`.`mid` IN (2, 4) LIMIT 21
5.2.6 查询在 2 个数值之间的所有数据
5.2.6.1 查询在 2 个数值之间的所有数据的操作
>>> Movies.objects.filter(mid__range=(2,4))
<QuerySet [<Movies: Movies object (2)>, <Movies: Movies object (3)>, <Movies: Movies object (4)>]>

(补充:这里以查询 movies 表中 mid 字段的值在 2 和 4 之间的所有数据为例)


注意:
1) 这里需要区分大小写
2) 这里的 mid__range= 在 mid 和 range 之间有两个下横线 “_”

5.2.6.2 查询在 2 个数值之间的所有数据的 SQL 语句
>>> showsql()
SELECT `movies`.`mid`, `movies`.`mname`, `movies`.`mdesc`, `movies`.`mimg`, `movies`.`mlink` FROM `movies` WHERE `movies`.`mid` BETWEEN 2 AND 4 LIMIT 21


补充:
1) 这里以查询 movies 表中 mid 字段的值在 2 和 4 之间的所有数据为例
2) 这一步翻译成 SQL 语句也可以是:SELECT movies.mid, movies.mname, movies.mdesc, movies.mimg, movies.mlink FROM movies WHERE movies.mid >= 2 AND mid <= 4

5.3 Django MariaDB&MySQL 多条数据的空值条件查询(有可能 1 次只查出 1 条数据)

5.3.1 查询空值数据的操作
>>> Movies.objects.filter(mname__isnull=True)
<QuerySet []>

(补充:这里以查询 movies 表中 mname 字段是空值的数据为例)


注意:
1) 这里需要区分大小写
2) 这里的 mname__isnull= 在 mname 和 isnull 之间有两个下横线 “_”

5.3.2 查询控制数据的 SQL 语句
>>> showsql()
SELECT `movies`.`mid`, `movies`.`mname`, `movies`.`mdesc`, `movies`.`mimg`, `movies`.`mlink` FROM `movies` WHERE `movies`.`mname` IS NULL LIMIT 21

(补充:这里以查询 movies 表中 mname 字段是空值的数据为例)

内容六:Django MariaDB&MySQL 多条数据的精准查询(有可能 1 次只查出 1 条数据)

6.1 Django MariaDB&MySQL 所有数据的查询(有可能 1 次只查出 1 条数据)

6.1.1 查询所有数据的操作
>>> Movies.objects.all()
<QuerySet [<Movies: Movies object (1)>, <Movies: Movies object (2)>, <Movies: Movies object (3)>, <Movies: Movies object (4)>, <Movies: Movies object (5)>]>

(补充:这里以查询 movies 表中所有的数据为例)

6.1.2 查询所有数据的 SQL 语句
>>> showsql()
SELECT `movies`.`mid`, `movies`.`mname`, `movies`.`mdesc`, `movies`.`mimg`, `movies`.`mlink` FROM `movies` LIMIT 21

(补充:这里以查询 movies 表中所有的数据为例)

6.2 Django MariaDB&MySQL 某个范围内的所有数据查询(有可能 1 次只查出 1 条数据)

6.2.1 查询从某条数据到某条到数据之间的所有数据
6.2.1.1 查询从某条数据到某条到数据之间所有数据的操作
>>> Movies.objects.all()[2:4]
<QuerySet [<Movies: Movies object (3)>, <Movies: Movies object (4)>]>
6.2.1.2 查询从某条数据到某条到数据之间所有数据的 SQL 语句
>>> showsql()
SELECT `movies`.`mid`, `movies`.`mname`, `movies`.`mdesc`, `movies`.`mimg`, `movies`.`mlink` FROM `movies` LIMIT 2 OFFSET 2

(补充:这里以查询 movies 表中的第 2 条到第 4 条的数据为例)

6.2.2 查询从某条数据开始后所有数据
6.2.2.1 查询从某条数据开始后所有数据的操作
>>> Movies.objects.filter(mname__startswith='Tit')
<QuerySet [<Movies: Movies object (1)>]>

(补充:这里以查询 movies 表中 mname 字段包含 Tit 的数据之后的所有数据为例)


注意:
1) 这里需要区分大小写
2) 这里的 mname__startswith 在 mname 和 startswith 之间有两个下横线 “_”

6.2.2.2 查询从某条数据开始后所有数据的 SQL 语句
>>> showsql()
SELECT `movies`.`mid`, `movies`.`mname`, `movies`.`mdesc`, `movies`.`mimg`, `movies`.`mlink` FROM `movies` WHERE `movies`.`mname` LIKE BINARY 'Tit%' LIMIT 21

(补充:这里以查询 movies 表中 mname 字段以包含 Tit 的数据之后的所有数据为例)

6.2.3 查询从某条数据结束前的所有数据
6.2.3.1 查询从某条数据结束前所有数据的操作
>>> Movies.objects.filter(mname__endswith='nic')
<QuerySet [<Movies: Movies object (1)>]>

(补充:这里以查询 movies 表中 mname 字段包含 nic 的数据之前的所有数据为例)


注意:
1) 这里需要区分大小写
2) 这里的 mname__endswith 在 mname 和 endswith 之间有两个下横线 “_”

6.2.3.2 查询从某条数据结束前所有数据的 SQL 语句
>>> showsql()
SELECT `movies`.`mid`, `movies`.`mname`, `movies`.`mdesc`, `movies`.`mimg`, `movies`.`mlink` FROM `movies` WHERE `movies`.`mname` LIKE BINARY '%nic' LIMIT 21

(补充:这里以查询 movies 表中 mname 字段包含 nic 的数据之前的所有数据为例)

内容七:Django MariaDB&MySQL 的数据查询方式

7.1 Django MariaDB&MySQL 查询包含某些信息的部分字段

7.1.1 查询包含某些信息部分字段的操作
>>> Movies.objects.values('mname','mid').filter(mname__contains='Tit')
<QuerySet [{'mname': 'Titanic', 'mid': 1}]>

(补充:这里以查询 movies 表中 mname 字段包含 Tit 的所有数据为例)


注意:
1) 这里需要区分大小写
2) 这里的 mname__contains 在 mname 和 contains 之间有两个下横线 “_”

7.1.2 查询包含某些信息部分字段的 SQL 语句
>>> showsql()
SELECT `movies`.`mname`, `movies`.`mid` FROM `movies` WHERE `movies`.`mname` LIKE BINARY '%Tit%' LIMIT 21

(补充:这里以查询 movies 表中 mname 字段包含 Tit 的所有数据为例)

7.2 Django MariaDB&MySQL 忽略大小写查询

7.2.1 忽略大小写查询的操作
>>> Movies.objects.filter(mname__istartswith='Titanic')
<QuerySet [<Movies: Movies object (1)>]>

(补充:这里以查询 movies 表中 mname 字段包含 Titanic 的数据之后的所有数据为例)

(注意:这里的 mname__istartswith 在 mname 和 istartswith 之间有两个下横线 “_”)

7.2.2 忽略大小写查询的 SQL 语句
>>> showsql()
SELECT `movies`.`mid`, `movies`.`mname`, `movies`.`mdesc`, `movies`.`mimg`, `movies`.`mlink` FROM `movies` WHERE `movies`.`mname` LIKE 'Titanic%' LIMIT 21

(补充:这里以查询 movies 表中 mname 字段包含 Titanic 的数据之后的所有数据为例)

7.3 Django MariaDB&MySQL 排序查询

7.3.1 升序查询
7.3.1.1 升序查询的操作
>>> Movies.objects.order_by('mid')
<QuerySet [<Movies: Movies object (1)>, <Movies: Movies object (2)>, <Movies: Movies object (3)>, <Movies: Movies object (4)>, <Movies: Movies object (5)>]>

(补充:这里以查询 movies 表中的所有数据并以 mid 字段进行升序展示为例)

7.3.1.2 升序查询的 SQL 语句
>>> showsql()
SELECT `movies`.`mid`, `movies`.`mname`, `movies`.`mdesc`, `movies`.`mimg`, `movies`.`mlink` FROM `movies` ORDER BY `movies`.`mid` ASC LIMIT 21

(补充:这里以查询 movies 表中的所有数据并以 mid 字段进行升序展示为例)

7.3.2 降序查询
7.3.2.1 降序查询的操作
>>> Movies.objects.order_by('-mid')
<QuerySet [<Movies: Movies object (5)>, <Movies: Movies object (4)>, <Movies: Movies object (3)>, <Movies: Movies object (2)>, <Movies: Movies object (1)>]>

(补充:这里以查询 movies 表中的所有数据并以 mid 字段进行降序展示为例)

7.3.2.2 降序查询的 SQL 语句
>>> showsql()
SELECT `movies`.`mid`, `movies`.`mname`, `movies`.`mdesc`, `movies`.`mimg`, `movies`.`mlink` FROM `movies` ORDER BY `movies`.`mid` DESC LIMIT 21

(补充:这里以查询 movies 表中的所有数据并以 mid 字段进行降序展示为例)

7.4 Django MariaDB&MySQL 查询数据条数

7.4.1 查询数据条数的操作
>>> Movies.objects.count()
5

(补充:这里以查询 movies 表中的所有数据为例)

7.4.2 查询数据条数的 SQL 语句
>>> showsql()
SELECT COUNT(*) AS `__count` FROM `movies`

(补充:这里以查询 movies 表中的所有数据为例)

[排错] Django 常见错误的解决

报错代码

在网页上出现的报错信息

DisallowedHost at /

Invalid HTTP_HOST header: '192.168.102.2:8000'. You may need to add '192.168.102.2' to ALLOWED_HOSTS.

Request Method: 	GET
Request URL: 	http://192.168.102.2:8000/
Django Version: 	1.11.6
Exception Type: 	DisallowedHost
Exception Value: 	

Invalid HTTP_HOST header: '192.168.102.2:8000'. You may need to add '192.168.102.2' to ALLOWED_HOSTS.

Exception Location: 	/root/project/django_env/lib64/python3.6/site-packages/django/http/request.py in get_host, line 113
Python Executable: 	/root/project/django_env/bin/python
Python Version: 	3.6.8
Python Path: 	

['/root/project/mysite',
 '/usr/lib64/python36.zip',
 '/usr/lib64/python3.6',
 '/usr/lib64/python3.6/lib-dynload',
 '/root/project/django_env/lib64/python3.6/site-packages',
 '/root/project/django_env/lib/python3.6/site-packages']

Server time: 	Thu, 27 Feb 2020 06:08:45 +0000

解决方法

(django_env) [root@python mysite]# vi mysite/settings.py

将以下内容:

......
ALLOWED_HOSTS = []
......

修改为:

......
ALLOWED_HOSTS = ['*']
......

[内容] Django 单表数据的增加 (MariaDB 版)

注意:

1) 在增加 Django MariaDB&MySQL 数据之前要先创建连接了 MariaDB 数据库或 MySQL 数据库的 Django 项目

2) 对于本文而言,必须要先完成内容一里的内容,再完成内容二里的内容,才能继续完成内容三里的内容

正文:

内容一:配置 Django 环境

1.1 进入 Python 环境

(django_env) [root@python mysite]# python3

1.2 引入 os 模块和 django 模块

>>> import os,django

1.3 调用 mysite.settings 的配置

>>> os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
'mysite.settings'

1.4 让刚刚的调用生效

>>> django.setup()

1.5 调用 mysite 项目 movies 应用 models 模块里的所有内容

>>> from movies.models import *

内容二:设置一个显示上一句 SQL 语句的函数

>>> def showsql():
...     from django.db import connection
...     print(connection.queries[-1]['sql'])

(补充:这里的 [-1] 是指显示上一条操作的 SQL 语句)

内容三:Django MariaDB&MySQL 数据的增加

3.1 方法一

3.1.1 方法一增加数据的操作
>>> newitem = Movies(mid=10001,mname='test1',mdesc='test1',mimg='eternalcenter.com',mlink='eternalcenter.com')
>>> newitem.save()


补充:这里以添加一条
1) mid 字段的值为 10001
2) mname 字段的值为 test1
3) mdesc 字段的值为 test1
4) mimg 字段的值为 eternalcenter.com
5) mlink 字段的值为 eternalcenter.com
的数据为例

3.2.2 显示方法一增加数据的 SQL 语句
>>> showsql()
INSERT INTO `movies` (`mid`, `mname`, `mdesc`, `mimg`, `mlink`) VALUES (10001, 'test1', 'test1', 'eternalcenter.com', 'eternalcenter.com')


补充:这里以添加一条
1) mid 字段的值为 10001
2) mname 字段的值为 test1
3) mdesc 字段的值为 test1
4) mimg 字段的值为 eternalcenter.com
5) mlink 字段的值为 eternalcenter.com
的数据为例

3.2 方法二

3.2.1 方法二增加数据的操作
>>> Movies.objects.create(mid=10002,mname='test2',mdesc='test2',mimg='eternalcenter.com',mlink='eternalcenter.com')
<Movies: Movies object (10002)>


补充:这里以添加一条
1) mid 字段的值为 10002
2) mname 字段的值为 test2
3) mdesc 字段的值为 test2
4) mimg 字段的值为 eternalcenter.com
5) mlink 字段的值为 eternalcenter.com
的数据为例

3.2.2 显示方法二增加数据的 SQL 语句
>>> showsql()
INSERT INTO `movies` (`mid`, `mname`, `mdesc`, `mimg`, `mlink`) VALUES (10002, 'test2', 'test2', 'eternalcenter.com', 'eternalcenter.com')


补充:这里以添加一条
1) mid 字段的值为 10002
2) mname 字段的值为 test2
3) mdesc 字段的值为 test2
4) mimg 字段的值为 eternalcenter.com
5) mlink 字段的值为 eternalcenter.com
的数据为例