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

zdwk9cvp  于 2023-01-27  发布在  Go
关注(0)|答案(3)|浏览(178)

我有order_by()模型django,并得到了以下结果queryset:

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

结果不按id排序。
我希望顺序为MyModelid greater than 1的切片查询集获得以下结果:

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

有没有像这样不带循环的切片方法来减少查询?

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

eqoofvh91#

假设您正在基于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)
    )
)

您将获得在所需对象之前发布的帖子,或发布时间相同但修改日期较新的帖子的结果

4bbkushb

4bbkushb2#

您可以使用QuerySetManager提供的filterexclude函数。基本上您可以执行以下操作:

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

rmbxnbpk3#

您可以对列表结果进行切片,如下所示:

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

5表示根据过滤后的查询集只显示5条记录。

相关问题