Django:在某个ID之后获取查询集

Django: Get queryset after a certain ID

我目前有一个事件模型,其中对象按 event_time(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

# 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)

因为我是按 event_time 订购的,所以我需要一些独特的东西来对查询集进行分页。我需要确保当用户请求下一页时,他们看不到我们已经从上一页发送的相同对象。我怎样才能获得接下来的 10 行?

明确一点,我不能使用 id__gte、lte、gt、lt。 queryset 不是根据 ID 排序的,它是根据 event_time.

排序的

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

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

要获取特定页面的对象列表,只需在请求中发送额外参数 page_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)