哪种方式更好?为什么? queryset = Tariff.objects.filter(user=user).order_by('-created_at').first() 或者 queryset = Tariff.objects.filter(user=user).order_by('created_at').last()
您需要从数据库中获取最新的记录,哪种方式更好更快?
两者是等价的。 事实上,如果我们看一下 .last()
方法[Django-doc]
def last(self):
"""Return the last object of a query or None if no match is found."""
if self.ordered:
queryset = self.reverse()
else:
self._check_ordering_first_last_queryset_aggregation(method="last")
queryset = self.order_by("-pk")
for obj in queryset[:1]:
return obj
这将更改查询的顺序,因此如果您执行了
ORDER BY some_column ASC
,它现在将显示 ORDER BY some_column DESC
。因此两者都会产生相同查询。
但请注意:
queryset = Tariff.objects.filter(user=user).order_by('-created_at').first()
是不是
QuerySet
,它是Tariff
对象,或者None
(如果不存在这样的对象)。
您可以使用以下方法将其写得更短:
tariff = Tariff.objects.filter(user=user).latest('created_at')
如果该用户没有
Tariff.DoesNotExist
对象,则会引发 Tariff
异常,但这些都会产生相同的 SQL 查询。
如果尚未完成,您可以使用
created_at
[Django-doc] 在
db_index=True
字段上添加数据库索引,这通常会使查询速度更快。