📢📢📢📣📣📣
哈喽!大家好,我是「奇点」,江湖人称 singularity。刚工作几年,想和大家一同进步🤝🤝
一位上进心十足的【Java ToB端大厂领域博主】!😜😜😜
喜欢java和python,平时比较懒,能用程序解决的坚决不手动解决😜😜😜
✨ 如果有对【java】感兴趣的【小可爱】,欢迎关注我❤️❤️❤️感谢各位大可爱小可爱!❤️❤️❤️
————————————————如果觉得本文对你有帮助,欢迎点赞,欢迎关注我,如果有补充欢迎评论交流,我将努力创作更多更好的文章。

目录
今天我们学习一下Django的模型,
Django 对各种数据库提供了很好的支持,包括:PostgreSQL、MySQL、SQLite、Oracle。
Django 为这些数据库提供了统一的调用API。 我们可以根据自己业务需求选择不同的数据库。
MySQL 是 Web 应用中最常用的数据库。本章节我们将以 Mysql 作为实例进行介绍。你可以通过我的mysql教程,了解更多 MySQL 的基础知识。
如果你没安装 mysql 驱动,可以执行以下命令安装:
sudo pip3 install pymysql
之前写过Sql-Alchemy的教程,有兴趣的小伙伴可以看一下,Sql-Alchemy同样是一个python的ORM框架,简单易学。
0基础和我学python----SQLAlchemy框架(1)_奇点_97的博客-CSDN博客
开始今天的正题吧。
Django 模型使用自带的 ORM。
对象关系映射(Object Relational Mapping,简称 ORM )用于实现面向对象编程语言里不同类型系统的数据之间的转换。
ORM 在业务逻辑层和数据库层之间充当了桥梁的作用。
ORM 是通过使用描述对象和数据库之间的映射的元数据,将程序中的对象自动持久化到数据库中

一般来讲每一个模型对应到数据存储层面都对应一张表或者多张表。
每一个模型的属性---对应的数据存储层都是对应一个表的字段。我们通过ORM就能将业务的模型和数据库中的存储信息建立映射关系了。
ORM 把类映射成数据库中的表,把类的一个实例对象映射成数据库中的数据行,把类的属性映射成表中的字段,通过对象的操作对应到数据库表的操作,实现了对象到 SQL、SQL 到对象转换过程。
Django 把表模型定义为 Model,他需要继承自django.db.models中的 Model 类,只要是与数据表相关的操作,都需要继承这个类。同时ORM 对于数据库的的增删改查,也提供了一些简单的 API,例如 F 查询、Q 查询。
针对数据库中的字段类型,Django ORM 都有对应的 “xxxField” 来表述,见如下表格。
| 字段 | 说明 | 字段属性 |
|---|---|---|
| AutoFiled | 默然自增主键(Primary_key=Ture),Django 默认建立id字段为主键。 | |
| CharFiled | 字符类型 | Max_length=32,字符长度需要明确 |
| IntgerFiled | 整型 int | |
| DateFiled | 年月日时间类型 | auto_now=True,数据被更新就会更新时间 ;auto_now_add=True,数据第一次参数时产生。 |
| DateTimeFiled | 年月日小时分钟秒时间类型 | auto_now=True,数据被更新就会更新时间; auto_now_add=True,数据第一次参数时产生。 |
| DecimalFiled | 混合精度的小数类型 | max_digits=3,限定数字的最大位数(包含小数位);decimal_places=2,限制小数的最大位数。 |
| BooleanFiled | 布尔字段,对应数据库 tinyint 类型数据长度只有1位。 | 值为True或False |
| TextFiled | 用于大文本 |
这里罗列出了大部分的数据类型,后续如果涉及到其他类型的再进行介绍。
ORM框架的优缺点:
| 优点 | 缺点 |
|
|
ORM的解析过程
ORM中对象和sql数据库的对应关系

创建 MySQL 数据库( ORM 无法操作到数据库级别,只能操作到数据表)语法:
create database 数据库名称 default charset=utf8; # 防止编码问题,指定为 utf8
例如我们创建一个名为 test 数据库,编码指定为 utf8:
create database test default charset=utf8;
我们在项目的 settings.py 文件中找到 DATABASES 配置项,将其信息修改为:
- DATABASES = {
- 'default':
- {
- 'ENGINE': 'django.db.backends.mysql', # 数据库引擎
- 'NAME': 'test', # 数据库名称
- 'HOST': '127.0.0.1', # 数据库地址,本机 ip 地址 127.0.0.1
- 'PORT': 3306, # 端口
- 'USER': 'root', # 数据库用户名
- 'PASSWORD': '123456', # 数据库密码
- }
- }
如果你使用了 Python2.x 版本这里添加了中文注释,所以你需要在 HelloWorld/settings.py 文件头部添加 # -*- coding: UTF-8 -*-。
上面包含数据库名称和用户的信息,它们与 MySQL 中对应数据库和用户的设置相同。Django 根据这一设置,与 MySQL 中相应的数据库和用户连接起来。
接下来,告诉 Django 使用 pymysql 模块连接 mysql 数据库:
- # 在与 settings.py 同级目录下的 __init__.py 中引入模块和进行配置
- import pymysql
- pymysql.install_as_MySQLdb()
其实模型类本质上属于一个 Python 类,只不过在 Django 中称之为做模型类 ,它是由 django.db.models.Model 派生出的子类,在 Django 中模型类是数据交互的接口,一个模型类代表数据库中的一张数据表,模型类中每一个类属性都代表数据表中的一个字段。
Django 规定,如果要使用模型,必须要创建一个 app。我们使用以下命令创建一个 TestModel 的 app:
django-admin startapp TestModel
目录结构如下:

我们修改 TestModel/models.py 文件,代码如下:
- # models.py
- from django.db import models
-
- class Test(models.Model):
- name = models.CharField(max_length=20)
一旦你定义了你的模型,你需要告诉 Django 你准备 使用 这些模型。你需要修改设置文件中的 INSTALLED_APPS ,在这个设置中添加包含 models.py 文件的模块名称。
接下来在 settings.py 中找到INSTALLED_APPS这一项,如下:
- INSTALLED_APPS = (
- 'django.contrib.admin',
- 'django.contrib.auth',
- 'django.contrib.contenttypes',
- 'django.contrib.sessions',
- 'django.contrib.messages',
- 'django.contrib.staticfiles',
- 'TestModel', # 添加此项
- )
在命令行中运行:
- $ python3 manage.py migrate # 创建表结构
-
- $ python3 manage.py makemigrations TestModel # 让 Django 知道我们在我们的模型有一些变更
- $ python3 manage.py migrate TestModel # 创建表结构


看到几行 "Creating table…" 的字样,你的数据表就创建好了。
表名组成结构为:应用名_类名(如:TestModel_test)。
注意:尽管我们没有在 models 给表设置主键,但是 Django 会自动添加一个 id 作为主键。

接下来我们在 HelloWorld 目录中添加 testdb.py 文件(下面介绍),并修改 urls.py:
- from django.urls import path
- from TestModel import views,testdb
- # urlpatterns = [
- # path('admin/', admin.site.urls),
- # ]
-
- urlpatterns=[
- path('test/',views.test),
- path('testdb/',testdb.testdb) #路由到这个路径对应的文件
- ]
文件下的方法

- from django.http import HttpResponse
-
- from TestModel.models import Test
-
-
- # 数据库操作
- def testdb(request):
- test1 = Test(name='test')
- test1.save()
- return HttpResponse("
数据添加成功!
")


方法2:
我们可以直接使用类名(即数据表名)来插入数据,下面是插入数据的一种方法:
Test.objects.create(name='jay')
读到这里,您可能会对“ objects ”产生疑问,所以在此处讲解一个重要的概念:每个继承自 models.Model 的模型类,都会有一个 objects 对象被同时继承下来,这个对象就叫做“管理器对象”,数据库的增删改查可以用 objects 管理器对象来实现。下面如果出现objects是同样的道理,就不再赘述。
下面用objects写几个其他的CRUD的操作的🌰
-
- Test.objects.all()#查询表中的所有记录
- Test.objects.filter(name_contains='j')#查询表中name含有“j”的所有记录,被使用较多
- Test.objects.get(name="john")#有且只有一个查询结果,如果超出一个或者没有,则抛出异常
- Test.objects.get(name="john").delete()#删除名字为john的记录
- Test.objects.get(name="john").update(name='TOM')#更新数据表的name为TOM
-
-
查询数据
Django提供了多种方式来获取数据库的内容,如下代码所示:
创建一个新的文件testdb1.py内容如下
- from django.http import HttpResponse
-
- from TestModel.models import Test
-
-
- # 数据库操作
- def testdb1(request):
- # 初始化
- response = ""
- response1 = ""
- # 通过objects这个模型管理器的all()获得所有数据行,相当于SQL中的SELECT * FROM
- list = Test.objects.all()
- # filter相当于SQL中的WHERE,可设置条件过滤结果
- response2 = Test.objects.filter(id=1)
- # 获取单个对象
- response3 = Test.objects.get(id=1)
- # 限制返回的数据 相当于 SQL 中的 OFFSET 0 LIMIT 2;
- Test.objects.order_by('name')[0:2]
-
- # 数据排序
- Test.objects.order_by("id")
- # 上面的方法可以组合使用
- Test.objects.filter(name="test").order_by("id")
-
- for var in list:
- response1 += var.name + " "
- response = response1
- return HttpResponse("
"
+ response + "")
同时在urls.py中增加对应的映射路径
- urlpatterns = [
- path('test/', views.test),
- path('testdb/', testdb.testdb),
- path('testdb1/', TestModel.testdb1.testdb1),
- ]

新添加一个数据
更新数据在testdb1.py文件中添加一下更新代码的方法
-
- # 数据库操作
- def testdbupdate(request):
- """
- :param request:
- :return:
- """
- # 修改其中一个id=1的name字段,再save,相当于SQL中的UPDATE
- test1 = Test.objects.get(id=1)
- test1.name = 'Google'
- test1.save()
-
- # 另外一种方式
- # Test.objects.filter(id=1).update(name='Google')
-
- # 修改所有的列
- # Test.objects.all().update(name='Google')
-
- return HttpResponse("
修改成功
")
同时在urls.py中增加地址
-
- urlpatterns = [
- path('test/', views.test),
- path('testdb/', testdb.testdb),
- path('testdb1/', TestModel.testdb1.testdb1),
- path('testdbupdate/', TestModel.testdb1.testdbupdate),
- ]


id是1的被修改成设定的值了
删除数据库中的对象只需调用该对象的delete()方法即可:
- # 数据库操作
- def testdb_delete(request):
- # 删除id=1的数据
- test1 = Test.objects.get(id=2)
- test1.delete()
-
- # 另外一种方式
- # Test.objects.filter(id=1).delete()
-
- # 删除所有数据
- # Test.objects.all().delete()
-
- return HttpResponse("
删除成功
")


只剩下id是1的了。用Djang实现的ORM框架的最基本的简单操作就是这些了。
注意:urls设置映射路径 和模块中对应的方法的映射关系
Django实现数据库的操作还是非常简单的,相信待这里同学们就知道任何使用Django实现ORM操作了。稍休息一下,我们继续学习Django

如果觉得本文对你有帮助,欢迎点赞,欢迎关注我,如果有补充欢迎评论交流,我将努力创作更多更好的文章。