从数据库中检索给定用户的最新记录

问题描述 投票:0回答:1

哪种方式更好?为什么?

queryset = Tariff.objects.filter(user=user).order_by('-created_at').first()

queryset = Tariff.objects.filter(user=user).order_by('created_at').last()

您需要从数据库中获取最新的记录,哪种方式更好更快?

django database postgresql
1个回答
0
投票

两者是等价的。 事实上,如果我们看一下 .last() 方法[Django-doc]

实现[GitHub]

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
字段上添加数据库索引,这通常会使查询速度更快。

© www.soinside.com 2019 - 2024. All rights reserved.