現在、オブジェクトがあるイベントモデルを持っていますASC順序でDjango IntergerFieldとして保存されているevent_time(UTC UNIXタイムスタンプ)でソートされます。私は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に基づいて順序付けられます。
回答:
回答№1は2Django Paginationを使用してそれを実現できます。
これにより、コード内のif-else部分が削除され、心配する必要がなくなります。 last_event_id
その後。すべてを送信するだけ 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)