简体   繁体   English

在 Django 中的 order_by() 之后切片查询集

[英]Slice queryset after order_by() in Django

I have order_by() model django and got queryset following result:我有order_by() model django 并得到查询集以下结果:

queryset = <QuerySet [<MyModel: MyModel object (4)>, <MyModel: MyModel object (2)>, 
<MyModel: MyModel object (1)>, <MyModel: MyModel object (3)>, <MyModel: MyModel object (5)>]>

The result is not sorted by id.结果未按 id 排序。

And I want slice queryset that have order MyModel with id greater than 1 to get the following results:而且我想要具有id greater than 1的订单MyModel的切片查询集来获得以下结果:

new_queryset = <QuerySet [<MyModel: MyModel object (4)>, <MyModel: MyModel object (2)>]>

Is there any way to slice without loop like this to reduce the query?有什么方法可以像这样在没有循环的情况下进行切片以减少查询吗?

for index in range(len(queryset)):
    if queryset[index].id == 1:
        new_queryset = queryset[:index]
        break

You can make use of filter or exclude functions that the QuerySetManager provides.您可以使用QuerySetManager提供的filterexclude功能。 Basically you can do the following:基本上你可以做到以下几点:

new_queryset = MyModel.objects.filter(id__gt=1)

Assuming that you are ordering the queryset based on publish_datetime and modified , you can simply get the record with needed id, and filter the queryset according to the ordering relevant to the object, like this:假设您正在根据publish_datetimemodified对查询集进行排序,您可以简单地获取具有所需 id 的记录,并根据与对象相关的排序过滤查询集,如下所示:

from django.db.models import F, Q

reference_object = MyModel.objects.get(id=1)
queryset = MyModel.objects.filter(
    Q(publish_datetime__lt=reference_object.publish_datetime) |
    Q(
        Q(publish_datetime=reference_object.publish_datetime) &
        Q(modified__gt=reference_object.modified)
    )
)

You will get the results where posts were published before the needed object, or with the same published time, but with more recent modified date您将获得在所需对象之前发布帖子的结果,或者发布时间相同但修改日期更近的结果

You can slice the list result as shown below:您可以对列表结果进行切片,如下所示:

new_queryset = MyModel.objects.filter(id__gt=1)[:5]

The 5 means the only 5 records would be displayed according to your filtered queryset. 5 表示根据您过滤的查询集只会显示 5 条记录。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM