[Django]orm的简介与用法介绍

本文深入讲解ORM框架原理,包括其如何实现数据模型与数据库的解耦,提高代码通用性。探讨了ORM的基本概念,创建数据库表格的方法,以及常用字段和选项的详细说明。此外,还介绍了外键的设置和文件迁移的过程,提供了数据库操作的实用指南。

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 设置为默认值,仅在该字段设置了默认值时可用

=================================================================================================

执行文件迁移:

要将建立好的数据库模型映射到数据库中,需要进行文件的迁移;

  1. 生成迁移文件: python manage.py makemigrations
  2. 执行文件迁移: 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. 添加数据
    方法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’) # 降序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值