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
数据,而且效率不高!有什么想法吗
这是不正确的
QuerySet
是懒惰的。这意味着不计算.all()
,除非您“消费”它,例如通过对它进行迭代,或者通过对它调用len(…)
或str(…)
即使您切片,它也不会立即进行查询,您将获得一个
QuerySet
,承诺在需要时进行查询。因此:甚至不会进行查询,除非您对其进行迭代,在这种情况下,它将使用以下内容进行查询:
例如,您可以通过以下方式检查查询:
例如,在Django shell中
但是,这将不返回最新的三个元素,它可以返回模型的任意三个元素。如果要使用主键最大的元素,可以使用:
此外,按主键排序不是一个好主意,因为您无法控制主键的分布方式,这是数据库的责任。您可以更好地创建一个存储时间戳的字段:
然后通过最新的时间戳检索元素:
创建一个数据时间模型
在视图中,获取创建的字段
减号表示数据库中的最新数据,在切片的帮助下,我们得到了最新的六项
相关问题 更多 >
编程相关推荐