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 })
@@ -190,6 +192,23 @@ def post(self, *args, **kwargs):
190192
191193 return result
192194
195+ def _get_parent_filter (self , url , kwargs ):
196+ """
197+ Returns a dictionary of filters that should be applied to ensure only resources
198+ belonging to the parent resource are returned
199+ """
200+
201+ url_segments = url .split ('/' )
202+ parent_segment = url_segments [- 3 ]
203+ parent_id = url_segments [- 2 ]
204+
205+ for key , value in self .schema ._declared_fields .items ():
206+ if isinstance (value , BaseRelationship ):
207+ if value .type_ == parent_segment :
208+ return {value .id_field : parent_id }
209+
210+ return {}
211+
193212 def before_get (self , args , kwargs ):
194213 """Hook to make custom work before get method"""
195214 pass
@@ -209,8 +228,8 @@ def after_post(self, result):
209228 def before_marshmallow (self , args , kwargs ):
210229 pass
211230
212- def get_collection (self , qs , kwargs ):
213- return self ._data_layer .get_collection (qs , kwargs )
231+ def get_collection (self , qs , kwargs , filters = None ):
232+ return self ._data_layer .get_collection (qs , kwargs , filters = filters )
214233
215234 def create_object (self , data , kwargs ):
216235 return self ._data_layer .create_object (data , kwargs )
0 commit comments