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