当只有 1 个对象可用于检索时,过滤 vs 在 Django ORM 中获取性能

filter vs get performance in Django ORM, when there's only 1 object available for retrieval

我有一个 Django 应用程序。 仅就 ORM/query/DB 性能 而言,以下是检索等效对象的方法(即在只有一个 Car 对象的情况下 owner_id = pk 目前在 table):

Car.objects.get(owner_id=pk)

Car.objects.filter(owner_id=pk).latest('id')

owner 是外键关系,因此是数据库索引。 SQL 查询产生的结果是否相同(或相同)?

它们不等价,因为如果未找到任何内容,.get() 将 return 抛出 DoesNotExist 异常,而 .filter() return 是一个空查询集。

至于性能,我首先要确保我过滤的字段在数据库中有一个索引。

在 Django 中默认为 ForeignKey

A database index is automatically created on the ForeignKey

由于您使用的是外键,get()filter() 将提供相同的性能。

你怎么看get()

objs = Car.objects.get(owner_id=pk)

Django get()实际上是如何实现的

objs = Car.objects.filter(owner_id=pk)
   if len(objs) == 1:
      obj = objs[0]
   else if len(objs) > 1:
      # Multiple objects returned
   else: 
      # we have no object!  do something
      pass

对于你的情况,我建议使用 get() 因为

  1. 可以确定只返回一个元素

  2. 它就是为此目的而设计的