ORM的简介
不论是MVC框架还是MVT框架,都包含了一个重要的部分,就是orm,ORM实现了数据模型与数据库的耦合与解耦,即数据模型的设计不再需要依赖特定的数据库,进过简单的配置就可以实现更换数据库,提高代码的通用性。
- ORM中,O是object,类对象,R是relation,关系,M是mapping,映射
- 它帮我们把类和数据表进行了一个映射,可以让我们通过类和类对象就能操作它所对应的表格中的数据。
- ORM根据我们设计的类帮我们自动帮我们生成数据库中的表格,而不需要我们自行去建表。

创建表格:
-
使用类创建表格
-
1、定义一个类
-
2、定义一个字段
-
3、定义一个元类;在元类中:定义数据库中表的名字;定义站点管理中的表名;定义站点管理中表名的复数;
-
4、定义一个str的魔术方法,让表格类返回一个制定的字段(比如self.name)

常用的字段
类型 说明
AutoField 自动增长的IntegerField,通常不用指定,不指定时Django会自动创建属性名为id的自动增长属性
BooleanField 布尔字段,值为True或False
NullBooleanField 支持Null、True、False三种值
CharField 字符串,参数max_length表示最大字符个数
TextField 大文本字段,一般超过4000个字符时使用
IntegerField 整数
DecimalField 十进制浮点数, 参数max_digits表示总位数, 参数decimal_places表示小数位数
FloatField 浮点数
DateField 日期, 参数auto_now表示每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它
使用当前日期,默认为False; 参数auto_now_add表示当对象第一次被创建时自动设置当前时间,用于创建的时
间戳,它总是使用当前日期,默认为False; 参数auto_now_add和auto_now是相互排斥的,组合将会发生错误
TimeField 时间,参数同DateField
DateTimeField 日期时间,参数同DateField
FileField 上传文件字段
ImageField 继承于FileField,对上传的内容进行校验,确保是有效的图片
字段常用的选项
选项 说明
null 如果为True,表示允许为空,默认值是False
blank 如果为True,则该字段允许为空白,默认值是False
db_column 字段的名称,如果未指定,则使用属性的名称
db_index 若值为True, 则在表中会为此字段创建索引,默认值是False
default 默认
primary_key 若为True,则该字段会成为模型的主键字段,默认值是False,一般作为AutoField的选项使用
unique 如果为True, 这个字段在表中必须有唯一值,默认值是False
=================================================================================================
外键:类定义为 class ForeignKey(to,on_delete,**options) 。第一个参数是引用的是哪个模型,第二个参数是在使用外键引用的模型数据被删除了,这个字段该如何处理,比如有 CASCADE 、 SET_NULL 等。这里以一个实际案例来说明。比如有一个 User 和一个 Article 两
个模型。一个 User 可以发表多篇文章,一个 Article 只能有一个 Author ,并且通过外键进行引用。在设置外键时,需要通过on_delete选项指明主表删除数据时,对于外键引用表数据如何处理,在djan go.db.models中包含了可选常量:
CASCADE 级联,删除主表数据时连通一起删除外键表中数据
PROTECT 保护,通过抛出ProtectedError异常,来阻止删除主表中被外键应用的数据
SET_NULL 设置为NULL,仅在该字段null=True允许为null时可用
SET_DEFAULT 设置为默认值,仅在该字段设置了默认值时可用
=================================================================================================
执行文件迁移:
要将建立好的数据库模型映射到数据库中,需要进行文件的迁移;
- 生成迁移文件: python manage.py makemigrations
- 执行文件迁移: python manage.py migrate
完成此操作后,就可以在数据库中查看数据模型中定义的数据了。
===============================================================================================
查看mysql日志
1、sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
2、关闭两行代码的注释 general_log_file = /var/log/mysql/mysql.log
general_log = 1
3、 sudo service mysql restart #重启数据库
4、tail -f /var/log/mysql/mysql.log # 查看数据库日志
对数据库执行(增删改查)操作
在terminal中输入python manage.py shell进入shell模式,即可对数据库进行相关操作。
- 添加数据
方法1、在mysql中使用insert into 表格(数据)的方法添加数据。
方法2、使用Django提供的在数据库中添加数据的方法逐个进行添加
#添加数据方法1
users = Users(
uname='hello',
uage=5,
umobile='13123456644',
ugender=0,
is_delete=False)
users.save()
#添加数据方法2
BBSPost.objects.create(
btitle="人生如梦1",
bdate=date(2019,9,8),
bclick=100,
bcomment=99,
burl='www.renshengrumeng.com',
b_user_id=4,
is_delete=0);
查找数据
- 基本查询:
用法 过滤器 解释
模型类名.objects.过滤器 get 查询单一结果
all 查询多个结果
count 查询结果数量
get 查询单一结果,如果不存在会抛出模型类.DoesNotExist异常。
all 查询多个结果。
count 查询结果数量。 - 过滤查询:
实现SQL中的where功能,包括
用法 过滤器 解释
模型类名.objects.过滤器 filte 过滤出多个结果
exclude 排除掉符合条件剩下的结果
get 查询单一结果
• filter 过滤出多个结果
• exclude 排除掉符合条件剩下的结果
• get 过滤单一结果,多条就会报错
过滤条件的表达语法如下:
属性名称__比较运算符=值# 属性名称和比较运算符间使用两个下划线,所以属性名不能包括多个下划线

上述没有取反的过滤条件,取反可以通过使用exclude过滤器来实现。
F对象:两个属性比较

Q对象:多个过滤器逐个调用表示逻辑与关系,同sql语句中where部分的and关键字。如果需要实现逻辑或or的查询,需要使用
Q()对象结合|运算符,Q对象被义在django.db.models中。Q对象可以使用&、|连接,&表示逻辑与,|表示逻辑或。
Q对象前可以使用~操作符,表示非not。
聚合函数:使用aggregate()过滤器调用聚合函数。聚合函数包括:Avg 平均,Count 数量,Max 最大,Min 最小,Sum 求
和,被定义在django.db.models中。
关联查询:由一到多的访问语法:一对应的模型类对象.多对应的模型类名小写_set 例:
u = Users.objects.get(id=1)
u.bbspost_set.all()
由多到一的访问语法:
多对应的模型类对象.一对应的模型类中的关系类属性名 例:
b = BBSPost.objects.get(id=1)
b.b_user
<Users: 墙角二枝梅>
访问一对应的模型类关联对象的id语法:
多对应的模型类对象.关联类属性_id
例:
b = BBSPost.objects.get(id=1)
b.b_user_id
关联过滤查询:由多模型类条件查询一模型类数据:
语法如下:
关联模型类名小写__属性名__条件运算符=值(注意:如果没有"__运算符"部分,表示等于。)
例:查询帖子点击次数为40是那些用户发的
Users.objects.filter(bbspost__bclick=40)
<QuerySet [<Users: 墙角二枝梅>, <Users: 煮酒论你妹>, <Users: 墙角二枝梅>]>
查询帖子点击次数大于40是那些用户发的
Users.objects.filter(bbspost__bclick__gt=40)
<QuerySet [<Users: 花满楼>, <Users: 墙角二枝梅>, <Users: 郎郎323>, <Users: 煮酒论你妹>]>
由一模型类条件查询多模型类数据:
语法如下:
一模型类关联属性名__一模型类属性名__条件运算符=值
注意:如果没有"__运算符"部分,表示等于。
例:
查询用户为“花满楼”的所有帖子。
BBSPost.objects.filter(b_user__uname='花满楼')
<QuerySet [<BBSPost: 吉利汽车怎么样>, <BBSPost: 王者荣耀好玩吗>]>
查询用户年龄小于18发的所有帖子
BBSPost.objects.filter(b_user__uage__lt=18)
<QuerySet [<BBSPost: 处女座>, <BBSPost: 法律>, <BBSPost: 人生如梦1>]>
-
修改数据
-
修改更新有两种方法
1)save 修改模型类对象的属性,然后执行save()方法
>>> age = Users.objects.get(uage=‘17’)
>>> age.uage=20
>>> age.save() -
删除数据
2)update 使用模型类.objects.filter().update(),会返回受影响的行数
BBSPost.objects.filter(bcomment=14).update(bclick=14)
2
会比save多返回一个数据, 数据的含义:受影响的条数 -
数据排序
使用order_by对结果进行排序
Users.objects.all().order_by(‘uage’) # 升序
BBSPost.objects.all().order_by(’-bcomment’) # 降序
本文深入讲解ORM框架原理,包括其如何实现数据模型与数据库的解耦,提高代码通用性。探讨了ORM的基本概念,创建数据库表格的方法,以及常用字段和选项的详细说明。此外,还介绍了外键的设置和文件迁移的过程,提供了数据库操作的实用指南。
1789

被折叠的 条评论
为什么被折叠?



