Django ORM中get和filter的区别
在Django ORM中,查询数据时可以使用get或者filter方法,但是这两者之间存在差别,并且不同的情形下,应该选择不同的方法,这篇博客介绍两种方法之间的区别。
准备工作
首先创建数据表Test_user,用于之后的示例演示。
from django.db import models
class Test_user(models.Model):
name = models.CharField(max_length=20)
age = models.SmallIntegerField(default=0)
sex = models.CharField(max_length=5, default='未知')
在数据库中进行查看:
然后我们插入几条数据:
在数据库中进行查看:
get和filter的区别
1. 返回值
- get的返回值是一个定义的model类的实例,即对象
- filter的返回值是一个QuerySet的集合对象,可使用迭代或者遍历,切片等,但是不等于list类型(使用一定要注意)
示例如下:
2. 抛出异常
- get:只有一条记录返回的时候才正常。所以get多用于查询主键字段或者具有唯一性约束的字段,当有多条记录或者没有记录返回时,使用get均会抛出异常。
- filter:没有记录、有一条或者多条记录返回均不会抛出异常。(没有记录的时候,返回值是一个空集合)
示例如下:
使用get进行查询:
(1)当返回多条记录时:
(2)当没有记录返回时:
使用filter进行查询:
(1)当返回多条记录时:
(2)当没有记录返回时:
3. 对数据表进行修改
前面的博客Django学习Day10——模型的使用(二)中介绍了对数据表中的数据进行修改的两种方式:
(1)user.update()方法
这种方法只能配合filter方法进行使用:
使用get方法会报错:
(2)user.xx = xx, user.save()
这种更新数据的方式可以和get或者filter方法进行配合使用:
示例如下:
在数据库中进行查看:
然后我们使用filter的方法,再将小明的年龄修改回去:
在数据库中进行查看:
参考资料
1、https://docs.djangoproject.com/zh-hans/3.1/topics/db/queries/#retrieving-a-single-object-with-get
2、https://blog.csdn.net/orangleliu/article/details/38597593