/ / Django:特定のIDの後にクエリセットを取得する-python、django、django-queryset

Django:特定のIDの後にクエリセットを取得する - python、django、django-queryset

現在、オブジェクトがあるイベントモデルを持っています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は2

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