Skip to content

Commit

Permalink
Add QuerySet.map to manager class + type checking + tests + docs
Browse files Browse the repository at this point in the history
  • Loading branch information
onyb committed Aug 26, 2017
1 parent 988d2ae commit df25744
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 2 deletions.
14 changes: 14 additions & 0 deletions docs/querysets.md
Original file line number Diff line number Diff line change
Expand Up @@ -203,4 +203,18 @@ example of `order_by()`.
>>> queryset.distinct('last_name')
[Character(first_name='Robert', last_name='Baratheron'),
Character(first_name='Catelyn', last_name='Stark')]
```

##### [](#header-5)map(func)

Applies a `callable` function on each item in the `QuerySet` and yields
a generator `map` object containing the result.

**Example:**
```py
>>> queryset
[Character(first_name='robert', last_name='baratheron'),
Character(first_name='catelyn', last_name='stark')]
>>> list(queryset.map(lambda x: x.first_name.upper()))
['ROBERT', 'CATELYN']
```
6 changes: 6 additions & 0 deletions reobject/models/manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,12 @@ def random(self) -> object:
"""
return self.all().random()

def map(self, func) -> object:
"""
Returns a random model instance.
"""
return self.all().map(func)

def __repr__(self):
return '<{manager}: {model}>'.format(
manager=type(self).__name__, model=self.model.__name__
Expand Down
9 changes: 7 additions & 2 deletions reobject/query/queryset.py
Original file line number Diff line number Diff line change
Expand Up @@ -137,8 +137,13 @@ def latest(self, field_name='created'):
else:
return obj

def map(self, callable):
return map(callable, self)
def map(self, func):
if not callable(func):
raise TypeError(
'Expected a callable, got {}'.format(type(func))
)

return map(func, self)

def none(self):
return EmptyQuerySet(model=self.model)
Expand Down
10 changes: 10 additions & 0 deletions tests/unit/test_queryset.py
Original file line number Diff line number Diff line change
Expand Up @@ -344,3 +344,13 @@ def test_manager_random(self):
obj = SomeModel.objects.random()

self.assertIn(obj, SomeModel.objects.all())

def test_manager_map(self):
SomeModel(p='foo', q=1)
SomeModel(p='bar', q=2)

result = SomeModel.objects.map(
func=lambda obj: obj.p.upper()
)

self.assertEqual(set(result), {'FOO', 'BAR'})

0 comments on commit df25744

Please sign in to comment.