[英]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
提供的filter
或exclude
功能。 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_datetime
和modified
对查询集进行排序,您可以简单地获取具有所需 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.