Django(3)模型(一)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: Django(3)模型
>>> django.VERSION  
(4, 1, 0, 'final', 0)

下面使用数据库为Mysql5.7


PS:基于前几章的进度进行修改


一、Django 模型——ORM


  • Django对各种数据库都提供了很好的支持,例如:PostgrSQL、Mysql、Oracle等。并且Django为这些数据库提供了统一的API,也就是说我们调用不同的数据库时,只需要使用一种方式即可
  • Django 模型使用自带的ORM,用于实现面向对象编程语言中不同类型系统数据之间的转换


对象关系映射(Object Relational Mapping,简称ORM):ORM模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。


  • 下面是菜鸟提供的示例图:


34bef176c0394bca9f382cee70b3481b.png


ORM的优缺点:


优点:


提高开发效率

不同数据库可以平滑切换


缺点:


ORM代码转换成SQL语句时,需要花费一定的时间,会降低执行效率

长期写ORM代码,会降低SQL语句的能力

ORM解析过程:


ORM会将Python代码转换成SQL语句

SQL语句通过pymysql传送到数据库服务端

在数据库执行SQL语句并且返回结果


菜鸟提供的ORM对应关系表


dad39c52585446d28b7f5db8bfefc2bf.png

二、数据库配置


  • Django配置mysql数据库,在项目的settings.py文件中找到DATABASES配置项进行修改


#这之前先部署一个mysql,创建一个库
mysql> create database test default charset=utf8;
Query OK, 1 row affected, 1 warning (0.00 sec)
#然后再修改
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}
#修改为:
DATABASES = {
    'default':
    {
        'ENGINE': 'django.db.backends.mysql',    # 数据库引擎
        'NAME': 'test', # 数据库名称
        'HOST': '10.10.30.69', # 数据库地址,本机 ip 地址 127.0.0.1 
        'PORT': 3306, # 端口 
        'USER': 'root',  # 数据库用户名
        'PASSWORD': 'fosafer.com', # 数据库密码
    }
}


  • 然后修改项目目录中的__init__.py文件,导入mysql模块


import pymysql
pymysql.install_as_MySQLdb()


  • 这时可能会报错,找不到模块pymysql,可以安装一下
(test) PS F:\django\helloworld> pip install pymysql  #安装
Collecting pymysql
  Using cached PyMySQL-1.0.2-py3-none-any.whl (43 kB)
Installing collected packages: pymysql
Successfully installed pymysql-1.0.2
WARNING: You are using pip version 22.0.4; however, version 22.2.2 is available.
You should consider upgrading via the 'F:\django\test\Scripts\python.exe -m pip install --upgrade pip' command.
  • 重新启动django,没报错就表示数据连接成功
(test) PS F:\django\helloworld> python .\manage.py runserver 0.0.0.0:8000  #启动
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.   #可以看到这里提示要输入的命令
August 18, 2022 - 11:20:59
Django version 4.1, using settings 'helloworld.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CTRL-BREAK.


三、定义模型(创建数据表)


每个模型都是Python的一个类,这些类继承django.db.models.Model。而每个类的属性都相当于是一个数据库的字段,也就是说模型中每个类代表一张表,而类的属性是表的字段


Django规定,如果要使用模型,就必须创建一个app,使用django-admin startapp TestModel可以创建一个名叫TestModel的app

(test) PS F:\django\helloworld> django-admin startapp TestModel
(test) PS F:\django\helloworld> ls
    目录: F:\django\helloworld
Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         2022/8/17     14:17                helloworld
d-----         2022/8/18     10:45                static
d-----         2022/8/17     14:17                templates
d-----         2022/8/18     13:57                TestModel  #创建了一个TestModel的目录
-a----         2022/8/17     10:49              0 db.sqlite3
-a----         2022/8/17     10:49            688 manage.py
(test) PS F:\django\helloworld> cd TestModel     #进入目录
(test) PS F:\django\helloworld\TestModel> ls  #查看目录结构
    目录: F:\django\helloworld\TestModel
Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         2022/8/18     13:57                migrations
-a----         2022/8/18     13:57             66 admin.py
-a----         2022/8/18     13:57            156 apps.py
-a----         2022/8/18     13:57             60 models.py
-a----         2022/8/18     13:57             63 tests.py
-a----         2022/8/18     13:57             66 views.py
-a----         2022/8/18     13:57              0 __init__.py

修改models.py文件


from django.db import models
class Aaa(models.Model):
    name = models.CharField(max_length=20)
    age = models.CharField(max_legth=3


解析:


上面定义的类名称Aaa,代表了数据库的表名

Test类继承了models.Model

类中的字段代表数据表中的字段,也就是name,数据类型有CharField(相当于varchar)、DateField(相当于datetime),而max_length参数用来限定长度


最终会创建一个名叫TestModel_aaa的表,名称是app+类的名称组成的,表中的字段有name,name字段的数据类型为varchar,限制20个长度,相当于下面的sql语句:


注意:如果没有设置主键,那么django会自动添加一个id的主键

CREATE TABLE TestModel_aaa(
    "id" serial NOT NULL PRIMARY KEY,
  "name" varchar(20) NOT NULL,
    "age" varchar(3) NOT NULL
);
  • 修改settings.py文件使用创建的模型


创建模型之后需要告诉Django,在setting.py文件中,添加app,添加新创建模型名称即可

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'TestModel',  #添加新的app
]
  • 在命令行中运行,先把后台关掉
(test) PS F:\django\helloworld> python manage.py migrate #执行对模型修改的操作
- 执行上面的命令后,查看mysql数据库,可以发现已经创建了数据表
mysql> 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             |
+----------------------------+
10 rows in set (0.00 sec)
- 下面来创建TestModel模型的表
(test) PS F:\django\helloworld> python manage.py makemigrations TestModel #对操作进行记录,后面可以指定模型
#输出:
    - Create model Aaa
(test) PS F:\django\helloworld> python manage.py migrate TestModel #执行对指定模型的修改
#输出:
  Applying TestModel.0001_initial... OK
- 再次查看数据库,发现创建了TestModel_aaa 表
mysql> show tables;
+----------------------------+
| Tables_in_test             |
+----------------------------+
| TestModel_aaa              |  #创建的表
| 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             |
+----------------------------+
11 rows in set (0.00 sec)
- 查看表结构,可以看到 id 字段为主键
mysql> show create table TestModel_aaa;
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table         | Create Table                                                                                                                                                                                    |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| TestModel_aaa | CREATE TABLE `TestModel_aaa` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL,
  `age` varchar(3) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> describe TestModel_aaa;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | bigint(20)  | NO   | PRI | NULL    | auto_increment |
| name  | varchar(20) | NO   |     | NULL    |                |
| age   | varchar(3)  | NO   |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)


四、数据库基本操作


- 插入数据


  • HelloWorld容器目录下添加testdb.py文件,并修改urls.py文件
- 修改HelloWorld/HelloWorld/urls.py 文件
#-*- coding: utf-8 -*-
from django.urls import path
from . import index_test,testdb  #导入模块
urlpatterns = [
    path('hello/',index_test.Hello),
    path('testdb/',testdb.testdb)   #添加新资源
]
- 添加HelloWorld/HelloWorld/testdb.py 文件
#添加数据需要先创建对象,然后执行`save`函数进行保存,相当于`INSERT`SQL语句
# -*- coding: utf-8 -*-
from django.http import HttpResponse
from TestModel.models import Aaa  #对应TestModel模型的Aaa类
def testdb(request):
    test1 = Aaa(name="zhangsan",age="34")  #创建对象,设置对象属性
    test1.save()
    return HttpResponse("<p>数据添加成功!!!!</p>")
  • 启动服务,访问资源页面testdb
(test) PS F:\django\helloworld> python .\manage.py runserver 8000
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
August 19, 2022 - 16:33:21
Django version 4.1, using settings 'helloworld.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

访问IP:8000/testdb


4ce4063ae74e41229f3a0ffe28b88e2f.png


  • 去数据库查看,发现添加成功


bf58f6df038e460f8ae6b55c11b41bb3.png


- 获取数据


  • 上面的testdb.py编写的是插入数据,下面来看查询数据


(1)查询所有的数据行


- 修改testdb.py
# -*- coding: utf-8 -*-
from django.http import HttpResponse
from TestModel.models import Aaa
def testdb(request):
    response = ""       #提前定义空字符串
    response_id = ""
    response1 = ""
    response2 = ""
    list = Aaa.objects.all()  #查询所有数据行, 相当于 select * from table; 返回一个QuerySet对象,
    for i in list:    
        response1 = i.id   
        response2 += i.name + " " + i.age + ""   
    response = response2
    response_id = str(response1)  #把int类型转换成字符串
    return HttpResponse("<p>" + response_id + " "  + response + "</p>")


  • 访问IP:8000/testdb


2ba93efea7c64abfba34267e663b3fcc.png


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
5月前
|
存储 安全 网络协议
Python 教程之 Django(9)对模型中的字段进行验证
Python 教程之 Django(9)对模型中的字段进行验证
48 0
Python 教程之 Django(9)对模型中的字段进行验证
|
5月前
|
API 数据库 Python
Python 教程之 Django(8)在 Django 管理界面中渲染模型
Python 教程之 Django(8)在 Django 管理界面中渲染模型
43 0
Python 教程之 Django(8)在 Django 管理界面中渲染模型
|
5月前
|
SQL 数据库 索引
Django MTV - 模型层 - (专题)知识要点与实战案例
Django MTV - 模型层 - (专题)知识要点与实战案例
60 0
|
5月前
|
SQL 存储 API
Python 教程之 Django(7)Django 模型
Python 教程之 Django(7)Django 模型
76 1
Python 教程之 Django(7)Django 模型
|
4月前
|
关系型数据库 MySQL 数据库
数据迁移脚本优化过程:从 MySQL 到 Django 模型表
在大规模的数据迁移过程中,性能问题往往是开发者面临的主要挑战之一。本文将分析一个数据迁移脚本的优化过程,展示如何从 MySQL 数据库迁移数据到 Django 模型表,并探讨优化前后的性能差异。
|
2月前
|
机器学习/深度学习 前端开发 数据挖掘
基于Python Django的房价数据分析平台,包括大屏和后台数据管理,有线性、向量机、梯度提升树、bp神经网络等模型
本文介绍了一个基于Python Django框架开发的房价数据分析平台,该平台集成了多种机器学习模型,包括线性回归、SVM、GBDT和BP神经网络,用于房价预测和市场分析,同时提供了前端大屏展示和后台数据管理功能。
|
2月前
|
存储 数据库 开发者
Django Web架构:全面掌握Django模型字段(下)
Django Web架构:全面掌握Django模型字段(下)
50 2
|
2月前
|
API 数据库 开发者
【独家揭秘】Django ORM高手秘籍:如何玩转数据模型与数据库交互的艺术?
【8月更文挑战第31天】本文通过具体示例详细介绍了Django ORM的使用方法,包括数据模型设计与数据库操作的最佳实践。从创建应用和定义模型开始,逐步演示了查询、创建、更新和删除数据的全过程,并展示了关联查询与过滤的技巧,帮助开发者更高效地利用Django ORM构建和维护Web应用。通过这些基础概念和实践技巧,读者可以更好地掌握Django ORM,提升开发效率。
22 0
|
2月前
|
SQL Shell API
python Django教程 之 模型(数据库)、自定义Field、数据表更改、QuerySet API
python Django教程 之 模型(数据库)、自定义Field、数据表更改、QuerySet API
|
2月前
|
SQL 关系型数据库 MySQL
如何创建 Django 模型
如何创建 Django 模型
18 0