Django模型中的GET和filter的区别与联系
已于 2025年01月10日 10:54 修改
访问次数:18
在 Django ORM 中,get() 和 filter() 是两种常用的查询方法,主要用于从数据库中获取数据,但它们的功能和行为有显著区别。
1. get() 方法
特点:
- 返回单个对象。
- 如果查询的结果不是唯一的(即没有找到记录或找到了多条记录),会引发异常。
用法:
Blog.objects.get(id=1)
返回值:
- 如果查询结果只有一条,返回一个模型实例。
- 如果没有匹配的记录,抛出
DoesNotExist异常。 - 如果有多条记录满足条件,抛出
MultipleObjectsReturned异常。
适用场景:
- 用于查询某个特定对象(如根据主键查询)。
- 查询结果可以确保唯一时。
示例:
try:
blog = Blog.objects.get(id=1)
print(blog.title)
except Blog.DoesNotExist:
print("Blog not found")
except Blog.MultipleObjectsReturned:
print("Multiple blogs found")
2. filter() 方法
特点:
- 返回一个查询集(QuerySet)。
- 即使只有一条匹配记录,返回值仍是一个查询集,而不是单个对象。
- 如果没有匹配的记录,返回空的查询集,而不会引发异常。
用法:
Blog.objects.filter(category=1)
返回值:
- 返回一个
QuerySet对象,包含匹配的记录。 - 如果没有匹配的记录,返回空的查询集(长度为 0 的列表)。
适用场景:
- 用于获取多条记录。
- 可以进一步链式操作,比如排序、分页等。
示例:
blogs = Blog.objects.filter(category=1)
for blog in blogs:
print(blog.title)
if not blogs:
print("No blogs found")
区别与联系
区别:
| 特性 | get() | filter() |
| 返回值类型 | 单个模型实例 | 查询集(QuerySet) |
| 结果数量限制 | 仅允许返回一条记录 | 可以返回零条或多条记录 |
| 没有匹配记录时行为 | 抛出 DoesNotExist 异常 | 返回空的查询集 |
| 多条匹配记录行为 | 抛出 MultipleObjectsReturned 异常 | 返回所有匹配记录 |
联系:
- 过滤条件语法相同: get() 和 filter() 都可以使用同样的查询条件。 Blog.objects.get(category=1) Blog.objects.filter(category=1)
- 底层实现类似: 两者都生成 SQL 查询,但 get() 在内部会自动加上一个限制条件 LIMIT 2,以便检测多条记录的情况。
- 可以相互替代(但有副作用): 在某些场景下,filter() + .first() 可以替代 get()。 blog = Blog.objects.filter(id=1).first() # 不会抛异常 但是这样会失去 get() 自动校验唯一性的特性。
使用建议
- 使用
get(): - 使用
filter():
评论(0)