21
21
from flask_rest_jsonapi .data_layers .base import BaseDataLayer
22
22
from flask_rest_jsonapi .data_layers .alchemy import SqlalchemyDataLayer
23
23
from flask_rest_jsonapi .utils import JSONEncoder
24
+ from marshmallow_jsonapi .fields import BaseRelationship
24
25
25
26
26
27
class ResourceMeta (MethodViewType ):
@@ -116,7 +117,8 @@ def get(self, *args, **kwargs):
116
117
117
118
qs = QSManager (request .args , self .schema )
118
119
119
- objects_count , objects = self .get_collection (qs , kwargs )
120
+ parent_filter = self ._get_parent_filter (request .url , kwargs )
121
+ objects_count , objects = self .get_collection (qs , kwargs , filters = parent_filter )
120
122
121
123
schema_kwargs = getattr (self , 'get_schema_kwargs' , dict ())
122
124
schema_kwargs .update ({'many' : True })
@@ -186,6 +188,23 @@ def post(self, *args, **kwargs):
186
188
187
189
return result
188
190
191
+ def _get_parent_filter (self , url , kwargs ):
192
+ """
193
+ Returns a dictionary of filters that should be applied to ensure only resources
194
+ belonging to the parent resource are returned
195
+ """
196
+
197
+ url_segments = url .split ('/' )
198
+ parent_segment = url_segments [- 3 ]
199
+ parent_id = url_segments [- 2 ]
200
+
201
+ for key , value in self .schema ._declared_fields .items ():
202
+ if isinstance (value , BaseRelationship ):
203
+ if value .type_ == parent_segment :
204
+ return {value .id_field : parent_id }
205
+
206
+ return {}
207
+
189
208
def before_get (self , args , kwargs ):
190
209
"""Hook to make custom work before get method"""
191
210
pass
@@ -205,8 +224,8 @@ def after_post(self, result):
205
224
def before_marshmallow (self , args , kwargs ):
206
225
pass
207
226
208
- def get_collection (self , qs , kwargs ):
209
- return self ._data_layer .get_collection (qs , kwargs )
227
+ def get_collection (self , qs , kwargs , filters = None ):
228
+ return self ._data_layer .get_collection (qs , kwargs , filters = filters )
210
229
211
230
def create_object (self , data , kwargs ):
212
231
return self ._data_layer .create_object (data , kwargs )
0 commit comments