Skip to content

Commit c9fd9ff

Browse files
ArpitArpitSachan
Arpit
authored andcommitted
Added support to fetch latest object from mongoengine queryset
Update tests Handle comment to address the incosistent behaviour
1 parent 090e6e1 commit c9fd9ff

File tree

2 files changed

+43
-0
lines changed

2 files changed

+43
-0
lines changed

mongoengine/queryset/base.py

+17
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,23 @@ def first(self):
298298
result = None
299299
return result
300300

301+
def last(self):
302+
"""Retrieve the latest object matching the query."""
303+
if not self._ordering:
304+
raise OperationError(
305+
"Cannot use `last()` without ordering. Use `order_by()` on the queryset first."
306+
)
307+
308+
queryset = self.clone()
309+
if self._none or self._empty:
310+
return None
311+
312+
try:
313+
result = queryset[self.count() - 1]
314+
except IndexError:
315+
result = None
316+
return result
317+
301318
def insert(
302319
self, doc_or_docs, load_bulk=True, write_concern=None, signal_kwargs=None
303320
):

tests/queryset/test_queryset.py

+26
Original file line numberDiff line numberDiff line change
@@ -2599,6 +2599,32 @@ def test_order_by(self):
25992599
ages = [p.age for p in self.Person.objects.order_by("")]
26002600
assert ages == [40, 20, 30]
26012601

2602+
def test_last(self):
2603+
"""Ensure the retrieval of the latest object from the QuerySet based on the specified ordering."""
2604+
person1 = self.Person(name="User B", age=40).save()
2605+
person2 = self.Person(name="User A", age=20).save()
2606+
person3 = self.Person(name="User C", age=30).save()
2607+
2608+
assert self.Person.objects.order_by("age").last() == person1
2609+
assert self.Person.objects.order_by("-age").last() == person2
2610+
2611+
person2.age = 31
2612+
person2.save()
2613+
assert self.Person.objects.order_by("-age").last() == person3
2614+
assert self.Person.objects.order_by("age").last() == person1
2615+
2616+
person1.age = 41
2617+
person1.save()
2618+
assert self.Person.objects.order_by("age").last() == person1
2619+
2620+
assert self.Person.objects.order_by("name").last() == person3
2621+
2622+
assert self.Person.objects.filter(age__lt=40).order_by("age").last() == person2
2623+
assert self.Person.objects.filter(age__gt=50).order_by("age").last() is None
2624+
2625+
with pytest.raises(OperationError):
2626+
self.Person.objects.last()
2627+
26022628
def test_order_by_optional(self):
26032629
class BlogPost(Document):
26042630
title = StringField()

0 commit comments

Comments
 (0)