Skip to content

Commit c101277

Browse files
authored
Merge pull request #14 from dbrgn/nested_serializers
Do not apply filter to nested serializers
2 parents 806e260 + 922b5e2 commit c101277

File tree

3 files changed

+14
-8
lines changed

3 files changed

+14
-8
lines changed

drf_dynamic_fields/__init__.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,22 @@ def fields(self):
1515
"""
1616
Filters the fields according to the `fields` query parameter.
1717
18-
a blank `fields` parameter (?fields) will remove all fields.
19-
not passing `fields` will pass all fields
20-
individual fields are comma separated (?fields=id,name,url,email)
18+
A blank `fields` parameter (?fields) will remove all fields. Not
19+
passing `fields` will pass all fields individual fields are comma
20+
separated (?fields=id,name,url,email).
21+
2122
"""
2223
fields = super(DynamicFieldsMixin, self).fields
2324

2425
if not hasattr(self, '_context'):
25-
# we are being called before a request cycle.
26+
# We are being called before a request cycle
27+
return fields
28+
29+
# Only filter if this is the root serializer, or if the parent is the
30+
# root serializer with many=True
31+
is_root = self.root == self
32+
parent_is_list_root = self.parent == self.root and getattr(self.parent, 'many', False)
33+
if not (is_root or parent_is_list_root):
2634
return fields
2735

2836
try:

tests/serializers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ def get_request_info(self, teacher):
3131
)
3232

3333

34-
class SchoolSerializer(serializers.ModelSerializer):
34+
class SchoolSerializer(DynamicFieldsMixin, serializers.ModelSerializer):
3535
"""
3636
Interesting enough serializer because the TeacherSerializer
3737
will use ListSerializer due to the `many=True`

tests/test_mixins.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -141,9 +141,8 @@ def test_as_nested_serializer(self):
141141
"""
142142
Nested serializers are not filtered.
143143
"""
144-
145144
rf = RequestFactory()
146-
request = rf.get('/api/v1/schools/1/')
145+
request = rf.get('/api/v1/schools/1/?fields=teachers')
147146

148147
school = School.objects.create()
149148
teachers = [
@@ -168,6 +167,5 @@ def test_as_nested_serializer(self):
168167
('request_info', request_info.format(teachers[1].id))
169168
])
170169
],
171-
'id': school.id
172170
}
173171
)

0 commit comments

Comments
 (0)