Skip to content

Commit 95f8ba1

Browse files
authored
Merge pull request #2828 from bagerard/allow_list_as_value_for_gte_lte_ne
allow_list_as_value_for_gte_lte_ne
2 parents 5a8b051 + ea1c3ee commit 95f8ba1

File tree

3 files changed

+44
-4
lines changed

3 files changed

+44
-4
lines changed

docs/changelog.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ Changelog
77
Development
88
===========
99
- (Fill this out as you fix issues and develop your features).
10+
- Allow gt/gte/lt/lte/ne operators to be used with a list as value on ListField #2813
1011
- Switch tox to use pytest instead of legacy `python setup.py test` #2804
1112

1213
Changes in 0.28.2

mongoengine/fields.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -951,11 +951,11 @@ def prepare_query_value(self, op, value):
951951
if self.field:
952952
# If the value is iterable and it's not a string nor a
953953
# BaseDocument, call prepare_query_value for each of its items.
954+
is_iter = hasattr(value, "__iter__")
955+
eligible_iter = is_iter and not isinstance(value, (str, BaseDocument))
954956
if (
955-
op in ("set", "unset", None)
956-
and hasattr(value, "__iter__")
957-
and not isinstance(value, str)
958-
and not isinstance(value, BaseDocument)
957+
op in ("set", "unset", "gt", "gte", "lt", "lte", "ne", None)
958+
and eligible_iter
959959
):
960960
return [self.field.prepare_query_value(op, v) for v in value]
961961

tests/queryset/test_field_list.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -459,6 +459,45 @@ class User(Base):
459459
with pytest.raises(LookUpError):
460460
Base.objects.exclude("made_up")
461461

462+
def test_gt_gte_lt_lte_ne_operator_with_list(self):
463+
class Family(Document):
464+
ages = ListField(field=FloatField())
465+
466+
Family.drop_collection()
467+
468+
Family(ages=[1.0, 2.0]).save()
469+
Family(ages=[]).save()
470+
471+
qs = list(Family.objects(ages__gt=[1.0]))
472+
assert len(qs) == 1
473+
assert qs[0].ages == [1.0, 2.0]
474+
475+
qs = list(Family.objects(ages__gt=[1.0, 1.99]))
476+
assert len(qs) == 1
477+
assert qs[0].ages == [1.0, 2.0]
478+
479+
qs = list(Family.objects(ages__gt=[]))
480+
assert len(qs) == 1
481+
assert qs[0].ages == [1.0, 2.0]
482+
483+
qs = list(Family.objects(ages__gte=[1.0, 2.0]))
484+
assert len(qs) == 1
485+
assert qs[0].ages == [1.0, 2.0]
486+
487+
qs = list(Family.objects(ages__lt=[1.0]))
488+
assert len(qs) == 1
489+
assert qs[0].ages == []
490+
491+
qs = list(Family.objects(ages__lte=[5.0]))
492+
assert len(qs) == 2
493+
494+
qs = list(Family.objects(ages__ne=[5.0]))
495+
assert len(qs) == 2
496+
497+
qs = list(Family.objects(ages__ne=[]))
498+
assert len(qs) == 1
499+
assert qs[0].ages == [1.0, 2.0]
500+
462501

463502
if __name__ == "__main__":
464503
unittest.main()

0 commit comments

Comments
 (0)