哪种方式更好?为什么?
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
字段上添加数据库索引,这通常会使查询速度更快。