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

时间:2015-07-13 18:26:43

标签: python django django-queryset

我目前有一个事件模型,其中对象按eventCtime(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。查询集不是基于ID排序的,它是基于event_time排序的。

1 个答案:

答案 0 :(得分:2)

您可以使用Django Pagination来实现这一目标。

这将删除代码中的if-else部分,然后您无需担心$output = exec($path . "phantomjs -v" . ' 2>&1'); var_dump($output); 。只需将所有last_event_id个对象发送到queryset以及您希望在每个页面上拥有的项目数,它就会为您提供访问每个页面的项目的方法。

要获取特定页面的对象列表,只需在请求中发送额外参数Paginator

试试这个:

page_no