有Django的一些功能,帮助您获得第一个或最后一个记录,如first()
,earliest()
,last()
和latest()
。我正在寻找的是一种无需读取所有数据即可获取最后一个对象的函数。例如这样的事情来获取最后3个对象:
last_three_objects = my_model.objects.get_last(count=3)
PS:我知道我可以这样获得:
last_three_objects = my_model.objects.all()[:3]
要么:
last_three_objects = my_model.objects.all().order_by('-datetime')[:3]
但是我认为它将my_model
从数据库读取所有数据,而且效率不高!有什么想法吗?
但是我认为它将
my_model
从数据库读取所有数据,而且效率不高!有什么想法吗?
那是不对的。QuerySet
s很懒。这意味着.all()
不会评估,除非您“消费”它,例如通过对其进行迭代,调用len(…)
或str(…)
对其进行调用。
即使你切,也不会进行查询马上,你获得QuerySet
的是承诺进行查询,如果你需要它。所以:
latest_three_objects = my_model.objects.all()[:3]
甚至不会进行查询,除非您对其进行迭代,在这种情况下,它将使用以下查询:
SELECT my_model.*
FROM my_model
LIMIT 3
例如,您可以通过以下方式检查查询:
print(my_model.objects.all()[:3].query)
例如在Django shell中。
但是,这不会返回最新的三个元素,而是可以返回模型的任何三个元素。如果要使用具有最大主键的元素,则可以使用:
my_model.objects.order_by('-pk')[:3]
此外,按主键排序不是一个好主意,因为您无法控制主键的分配方式,这是数据库的责任。您可以更好地创建一个存储时间戳的字段:
class MyModel(models.Model):
timestamp = models.DateTimeField(auto_now_add=True, db_index=True)
然后通过最新时间戳检索元素:
my_model.objects.order_by('-timestamp')[:3]
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句