在不读取Django中的所有对象的情况下,如何从DB中获取最后的一些对象?

2024-09-27 09:32:48 发布

您现在位置:Python中文网/ 问答频道 /正文

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数据,而且效率不高!有什么想法吗


Tags: 数据对象django函数modelobjectsmy记录
2条回答

But I think it will read all of my_model data from DB and it's not efficient! Any thoughts?

这是不正确的QuerySet是懒惰的。这意味着不计算.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]

创建一个数据时间模型

created = models.DateTimeField(auto_now_add=True, null=True)

在视图中,获取创建的字段

course = Course.objects.all().order_by('-created')[:6]

减号表示数据库中的最新数据,在切片的帮助下,我们得到了最新的六项

相关问题 更多 >

    热门问题