Skip to content

Commit b218224

Browse files
authored
Merge pull request #157 from kiptoomm/develop_nested_filter
Apply filtering on nested fields
2 parents d3569b6 + a0d975c commit b218224

File tree

2 files changed

+25
-12
lines changed

2 files changed

+25
-12
lines changed

examples/api_nested.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,15 @@ class PersonRelationship(ResourceRelationship):
144144
data_layer = {'session': db.session,
145145
'model': Person}
146146

147+
class PersonTagList(ResourceList):
148+
schema = PersonTagSchema
149+
data_layer = {'session': db.session,
150+
'model': Person_Tag}
151+
152+
class PersonTagDetail(ResourceDetail):
153+
schema = PersonTagSchema
154+
data_layer = {'session': db.session,
155+
'model': Person_Tag}
147156

148157
class ComputerList(ResourceList):
149158
def query(self, view_kwargs):
@@ -190,6 +199,9 @@ class ComputerRelationship(ResourceRelationship):
190199
api.route(ComputerDetail, 'computer_detail', '/computers/<int:id>')
191200
api.route(ComputerRelationship, 'computer_person', '/computers/<int:id>/relationships/owner')
192201

202+
api.route(PersonTagList, 'person_tag_list', '/persontags')
203+
api.route(PersonTagDetail, 'person_tag_detail', '/persontags/<int:id>')
204+
193205
if __name__ == '__main__':
194206
# Start application
195207
app.run(debug=True)

flask_rest_jsonapi/data_layers/filtering/alchemy.py

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from sqlalchemy import and_, or_, not_
66

77
from flask_rest_jsonapi.exceptions import InvalidFilters
8-
from flask_rest_jsonapi.schema import get_relationships, get_model_field
8+
from flask_rest_jsonapi.schema import get_relationships, get_nested_fields, get_model_field
99

1010

1111
def create_filters(model, filter_info, resource):
@@ -143,26 +143,27 @@ def value(self):
143143

144144
@property
145145
def related_model(self):
146-
"""Get the related model of a relationship field
146+
"""Get the related model of a related (relationship or nested) field
147147
148148
:return DeclarativeMeta: the related model
149149
"""
150-
relationship_field = self.name
150+
related_field_name = self.name
151151

152-
if relationship_field not in get_relationships(self.schema):
153-
raise InvalidFilters("{} has no relationship attribute {}".format(self.schema.__name__, relationship_field))
152+
related_fields = get_relationships(self.schema) + get_nested_fields(self.schema)
153+
if related_field_name not in related_fields:
154+
raise InvalidFilters("{} has no relationship or nested attribute {}".format(self.schema.__name__, related_field_name))
154155

155-
return getattr(self.model, get_model_field(self.schema, relationship_field)).property.mapper.class_
156+
return getattr(self.model, get_model_field(self.schema, related_field_name)).property.mapper.class_
156157

157158
@property
158159
def related_schema(self):
159-
"""Get the related schema of a relationship field
160+
"""Get the related schema of a related (relationship or nested) field
160161
161162
:return Schema: the related schema
162163
"""
163-
relationship_field = self.name
164+
related_field_name = self.name
165+
related_fields = get_relationships(self.schema) + get_nested_fields(self.schema)
166+
if related_field_name not in related_fields:
167+
raise InvalidFilters("{} has no relationship or nested attribute {}".format(self.schema.__name__, related_field_name))
164168

165-
if relationship_field not in get_relationships(self.schema):
166-
raise InvalidFilters("{} has no relationship attribute {}".format(self.schema.__name__, relationship_field))
167-
168-
return self.schema._declared_fields[relationship_field].schema.__class__
169+
return self.schema._declared_fields[related_field_name].schema.__class__

0 commit comments

Comments
 (0)