मेरे पास वर्तमान में एक इवेंट मॉडल है जहां ऑब्जेक्ट हैंइवेंट_टाइम (UTC UNIX टाइमस्टैम्प) द्वारा सॉर्ट किया गया जो ASC के क्रम में Django IntergerField के रूप में संग्रहीत है। क्योंकि मैं आईडी द्वारा छँटाई नहीं कर रहा हूँ, यह एक समस्या पैदा करता है जब यह पेजिंग की बात आती है, खासकर एक क्वेरी के साथ जो लगातार बढ़ रही है। यहाँ मेरा इवेंट मॉडल है:
# 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
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 का उपयोग नहीं कर सकता। क्वेरीसेट आईडी के आधार पर आदेशित नहीं है, यह event_time पर आधारित आदेश है।
उत्तर:
जवाब के लिए 2 № 1जिसे प्राप्त करने के लिए आप Django पेजिनेशन का उपयोग कर सकते हैं।
यह आपके कोड में 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)