2121from flask_rest_jsonapi .data_layers .base import BaseDataLayer
2222from flask_rest_jsonapi .data_layers .alchemy import SqlalchemyDataLayer
2323from flask_rest_jsonapi .utils import JSONEncoder
24+ from marshmallow_jsonapi .fields import BaseRelationship
2425
2526
2627class ResourceMeta (MethodViewType ):
@@ -116,7 +117,8 @@ def get(self, *args, **kwargs):
116117
117118 qs = QSManager (request .args , self .schema )
118119
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 )
120122
121123 schema_kwargs = getattr (self , 'get_schema_kwargs' , dict ())
122124 schema_kwargs .update ({'many' : True })
@@ -186,6 +188,23 @@ def post(self, *args, **kwargs):
186188
187189 return result
188190
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+
189208 def before_get (self , args , kwargs ):
190209 """Hook to make custom work before get method"""
191210 pass
@@ -205,8 +224,8 @@ def after_post(self, result):
205224 def before_marshmallow (self , args , kwargs ):
206225 pass
207226
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 )
210229
211230 def create_object (self , data , kwargs ):
212231 return self ._data_layer .create_object (data , kwargs )
0 commit comments