Python Django:在某个ID之后获取queryset

Python Django:在某个ID之后获取queryset,python,django,django-queryset,Python,Django,Django Queryset,我目前有一个事件模型,其中对象按事件时间(UTC UNIX时间戳)排序,并以ASC顺序存储为Django IntergerField。因为我没有按ID排序,所以在分页时会产生问题,特别是对于不断增长的查询集。以下是我的事件模型: # models.py class Event(models.Model): name = models.CharField(max_length=200) event_time = models.IntegerField(default= 0, nu

我目前有一个事件模型,其中对象按事件时间(UTC UNIX时间戳)排序,并以ASC顺序存储为Django IntergerField。因为我没有按ID排序,所以在分页时会产生问题,特别是对于不断增长的查询集。以下是我的事件模型:

# models.py

class Event(models.Model):
    name = models.CharField(max_length=200)
    event_time = models.IntegerField(default= 0, null=True, blank=True)
    created = models.DateTimeField(auto_now_add=True)
现在来看看我的观点

# views.py    

def events_view(request):
    # range of queryset sent in request params

    last_event_id = int(request.GET.get('last_event_id'))
    start_time = int(request.GET.get('start_time'))
    end_time = int(request.GET.get('end_time'))

    if last_event_id == 0:
        queryset = Event.objects.filter(event_time__gte = start_time,
                         event_time__lte = end_time).order_by('event_time')[:10]

    else:
        '''This is the part I'm having trouble with,
           when the client requests the second page,
           they will send the same start_time and event_time
           as before but also send the event id of the last 
           event object from the first page. I need 
           to be able to get the next 10 objects in the 
           queryset after that event ID.'''

    return HttpResponse(status=200)
因为我是按事件时间排序的,所以我需要一些独特的东西来分页查询集。我需要确保当用户请求下一页时,他们没有看到我们已经从上一页发送的相同对象。我怎样才能得到接下来的10行呢


为了清楚起见,我不能使用id\u gte、lte、gt、lt。查询集不是根据id排序的,而是根据事件时间排序的。

您可以使用Django分页来实现这一点。

这将删除代码中的if-else部分,您无需担心
最后一个事件\u id
then。只需将所有
queryset
对象发送到
Paginator
,以及您希望在每个页面上拥有的项目数,它将为您提供访问每个页面项目的方法

要获取特定页面的对象列表,只需在请求中发送一个额外的参数
page\u no

试试这个:

from django.core.paginator import Paginator

def events_view(request):
    # range of queryset sent in request params

    start_time = int(request.GET.get('start_time'))
    end_time = int(request.GET.get('end_time'))
    page_no = int(request.GET.get('page_no', 1))

    objects = Event.objects.filter(event_time__gte = start_time,
                         event_time__lte = end_time).order_by('event_time')
    p = Paginator(objects, 10)

    requested_page = p.page(page_no)
    requested_objects_list = requested_page.object_list #  required objects list

    return HttpResponse(status=200)

谢谢Rahul,我不能使用id_uGTE、gt、lte或lt。这些将只给我id大于上一个事件id的事件,这意味着我将错过一些对象。我只需要在该id之后的下一组对象,不大于该id。但这不是您希望在该事件\u id之后获得的下10个对象。请给出一个您可能错过的id示例,这可能会有帮助。是的,但事件不是基于id排序的,而是基于事件\u时间排序的。例如,如果last_event_id=9,则事件时间为今天下午2:00的事件,我仍然可以在明天下午5:00安排id小于9的事件。你看到我的困境了吗?是的,那会有点贵。您可以设置会话中请求的
id
s列表,然后在下一个请求中,使用该会话获取下一个id列表。我非常喜欢这种方法,感谢您抽出时间,Rahul,感谢您帮助我完成场景。