@@ -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):
5959class 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 ()
0 commit comments