在 Django 的 ORM 中,filter
和 get
是两种不同的查询方法,有不同的用途和行为:
filter
- 返回值:
filter
返回一个QuerySet
,即使查询结果只有一条记录或没有记录。 - 用法:
filter
用于获取满足条件的所有记录。它不会抛出异常,即使没有记录匹配查询条件。 - 示例:
这里build_tasks = BuildTask.objects.filter(id=build_task_id)
build_tasks
是一个QuerySet
,即使只有一条记录或没有记录。
get
- 返回值:
get
返回一个单一的对象,而不是QuerySet
。 - 用法:
get
用于获取满足条件的单一记录。如果有多条记录匹配查询条件,或者没有记录匹配查询条件,它会抛出异常。- 如果没有记录匹配查询条件,会抛出
DoesNotExist
异常。 - 如果有多条记录匹配查询条件,会抛出
MultipleObjectsReturned
异常。
- 如果没有记录匹配查询条件,会抛出
- 示例:
这里try: build_task = BuildTask.objects.get(id=build_task_id) except BuildTask.DoesNotExist: # 处理记录不存在的情况 except BuildTask.MultipleObjectsReturned: # 处理多条记录匹配的情况
build_task
是一个单一的BuildTask
对象。
选择使用 filter
还是 get
- 如果期望查询结果可能包含多条记录,或者想要一个
QuerySet
以便进一步过滤或操作,使用filter
。 - 如果确定查询结果应该只有一条记录,并且希望直接获取该记录,使用
get
。
示例对比
使用 filter
build_tasks = BuildTask.objects.filter(id=build_task_id)
if build_tasks.exists():
build_task = build_tasks.first()
else:
# 处理记录不存在的情况
使用 get
try:
build_task = BuildTask.objects.get(id=build_task_id)
except BuildTask.DoesNotExist:
# 处理记录不存在的情况
except BuildTask.MultipleObjectsReturned:
# 处理多条记录匹配的情况
总结来说,filter
更灵活,可以处理多条记录,而 get
更直接,用于获取单一记录。