当只有 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()
因为
可以确定只返回一个元素
它就是为此目的而设计的
我有一个 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()
因为
可以确定只返回一个元素
它就是为此目的而设计的