Skip to content

Commit c604477

Browse files
James LinJames Lin
authored andcommitted
added get(x) to query /api/x
1 parent 6a0374b commit c604477

File tree

2 files changed

+31
-9
lines changed

2 files changed

+31
-9
lines changed

rest_framework_queryset/queryset.py

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ def __init__(self, url, *args, **kwargs):
1414
self.args = args
1515
self.kwargs = kwargs
1616

17-
def call_api(self):
17+
def _call_api(self):
1818
"""
1919
perform api call
2020
"""
@@ -59,6 +59,10 @@ def page_result(self):
5959
class RestFrameworkQuerySet(BaseAPIQuerySet):
6060
page_size = 100
6161

62+
def __init__(self, *args, **kwargs):
63+
super(RestFrameworkQuerySet, self).__init__(*args, **kwargs)
64+
self.__id = None
65+
6266
def __iter__(self):
6367
paginator = Paginator(self, self.page_size)
6468
for page in paginator.page_range:
@@ -70,19 +74,26 @@ def _clone(self):
7074
cloned.page_size = self.page_size
7175
return cloned
7276

77+
def _call_api(self):
78+
if self.__id:
79+
self.url = '{}/{}'.format(self.url.rstrip('/'), self.__id)
80+
return super(RestFrameworkQuerySet, self)._call_api()
81+
7382
def count(self):
7483
cloned = self._clone()
7584
params = cloned.kwargs.get('params', {})
7685
params['offset'] = 0
7786
params['limit'] = 0
78-
resp = cloned.call_api()
87+
resp = cloned._call_api()
7988
result = resp.json()
8089
return result['count']
8190

8291
def get_result(self):
83-
response = self.call_api()
92+
response = self._call_api()
8493
result = response.json()
85-
return result['results']
94+
if 'results' in result:
95+
return result['results']
96+
return result
8697

8798
def page_result(self, slicer):
8899
cloned = self._clone()
@@ -97,12 +108,15 @@ def filter(self, **kwargs):
97108
params.update(kwargs)
98109
return cloned
99110

100-
def get(self, **kwargs):
111+
def get(self, __id=None, **kwargs):
101112
cloned = self.filter(**kwargs)
113+
cloned.__id = __id
102114
result = cloned.get_result()
103-
if len(result) > 1:
104-
raise MultipleObjectsReturned('get() returned more than one result, it returned {}'.format(cloned.count()))
105-
return result[0]
115+
if isinstance(result, list):
116+
if len(result) > 1:
117+
raise MultipleObjectsReturned('get() returned more than one result, it returned {}'.format(cloned.count()))
118+
return result[0]
119+
return result
106120

107121
def all(self):
108122
return self._clone()

tests.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,14 +41,22 @@ def test_filter_call(self):
4141
mock_get.assert_any_call('/api/', params={'a': 123, 'b': 234, 'offset': 0, 'limit': 10})
4242

4343
def test_get_call(self):
44-
fake_response = MagicMock(json=lambda:{'count': 10, 'results': range(10)})
44+
fake_response = MagicMock(json=lambda:{'count': 10, 'results': list(range(10))})
4545
with patch('rest_framework_queryset.queryset.requests.Session.get', return_value=fake_response) as mock_get:
4646
qs = RestFrameworkQuerySet('/api/')
4747
with self.assertRaises(MultipleObjectsReturned):
4848
qs1 = qs.get(a=123)
4949
self.assertEqual(list(qs), list(range(10)))
5050
mock_get.assert_any_call('/api/', params={'a': 123})
5151

52+
def test_get_call_by_id(self):
53+
fake_response = MagicMock(json=lambda:{'a': 123})
54+
with patch('rest_framework_queryset.queryset.requests.Session.get', return_value=fake_response) as mock_get:
55+
qs = RestFrameworkQuerySet('/api/')
56+
qs1 = qs.get(123)
57+
self.assertEqual(qs1, {'a': 123})
58+
mock_get.assert_any_call('/api/123', params={})
59+
5260
def test_count_call(self):
5361
fake_response = MagicMock(json=lambda:{'count': 10, 'results': range(10)})
5462
with patch('rest_framework_queryset.queryset.requests.Session.get', return_value=fake_response) as mock_get:

0 commit comments

Comments
 (0)