Django模型中的GET和filter的区别与联系

在 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 异常返回所有匹配记录

联系:

  1. 过滤条件语法相同: get() 和 filter() 都可以使用同样的查询条件。 Blog.objects.get(category=1) Blog.objects.filter(category=1)
  2. 底层实现类似: 两者都生成 SQL 查询,但 get() 在内部会自动加上一个限制条件 LIMIT 2,以便检测多条记录的情况。
  3. 可以相互替代(但有副作用): 在某些场景下,filter() + .first() 可以替代 get()。 blog = Blog.objects.filter(id=1).first() # 不会抛异常 但是这样会失去 get() 自动校验唯一性的特性。


使用建议

  • 使用 get()
  • 使用 filter()
文章标签:

评论(0)