Skip to content

Commit 954d94c

Browse files
author
i.donchev
committed
Adding nested serializers support for many=True relations
1 parent 14228cc commit 954d94c

File tree

5 files changed

+36351
-21
lines changed

5 files changed

+36351
-21
lines changed

.gitignore

+3
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,8 @@ drfdocs.egg-info/
1111

1212
site/
1313

14+
demo/node_modules/
15+
rest_framework_docs/static/rest_framework_docs/js/dist.min.js
16+
1417
rest_framework_docs/static/node_modules/
1518
rest_framework_docs/static/rest_framework_docs/js/dist.min.js.map

demo/project/organisations/serializers.py

+8-7
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,18 @@
33
from project.accounts.serializers import UserProfileSerializer
44

55

6+
class MembershipSerializer(serializers.ModelSerializer):
7+
class Meta:
8+
model = Membership
9+
fields = ('joined', 'is_owner', 'role')
10+
11+
612
class CreateOrganisationSerializer(serializers.ModelSerializer):
13+
membership_set = MembershipSerializer(many=True)
714

815
class Meta:
916
model = Organisation
10-
fields = ('name', 'slug',)
17+
fields = ('name', 'slug', 'membership_set')
1118

1219

1320
class OrganisationMembersSerializer(serializers.ModelSerializer):
@@ -29,12 +36,6 @@ class Meta:
2936
fields = ('name', 'slug', 'is_active')
3037

3138

32-
class MembershipSerializer(serializers.ModelSerializer):
33-
class Meta:
34-
model = Membership
35-
fields = ('joined', 'is_owner', 'role')
36-
37-
3839
class RetrieveOrganisationSerializer(serializers.ModelSerializer):
3940
membership_set = MembershipSerializer()
4041

rest_framework_docs/api_endpoint.py

+10-2
Original file line numberDiff line numberDiff line change
@@ -91,12 +91,20 @@ def __get_serializer_fields__(self, serializer):
9191

9292
if hasattr(serializer, 'get_fields'):
9393
for key, field in serializer.get_fields().items():
94-
sub_fields = self.__get_serializer_fields__(field) if isinstance(field, BaseSerializer) else None
94+
to_many_relation = True if hasattr(field, 'many') else False
95+
sub_fields = []
96+
97+
if to_many_relation:
98+
sub_fields = self.__get_serializer_fields__(field.child) if isinstance(field, BaseSerializer) else None
99+
else:
100+
sub_fields = self.__get_serializer_fields__(field) if isinstance(field, BaseSerializer) else None
101+
95102
fields.append({
96103
"name": key,
97104
"type": str(field.__class__.__name__),
98105
"sub_fields": sub_fields,
99-
"required": field.required
106+
"required": field.required,
107+
"to_many_relation": to_many_relation
100108
})
101109
# FIXME:
102110
# Show more attibutes of `field`?

rest_framework_docs/static/rest_framework_docs/js/dist.min.js

+36,326-12
Large diffs are not rendered by default.

rest_framework_docs/templates/rest_framework_docs/components/fields_list.html

+4
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@
66
<span class="label label-primary label-required" title="Required">R</span>
77
{% endif %}
88

9+
{% if field.to_many_relation %}
10+
<span class="label label-primary label-required" title="Required">many = True</span>
11+
{% endif %}
12+
913
{% if field.sub_fields %}
1014
{%include "rest_framework_docs/components/fields_list.html" with fields=field.sub_fields %}
1115
{% endif %}

0 commit comments

Comments
 (0)