Skip to content

Commit 935a384

Browse files
Add nested serializers support
1 parent 4f1d79e commit 935a384

File tree

6 files changed

+61
-20
lines changed

6 files changed

+61
-20
lines changed

demo/project/organisations/serializers.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,17 @@ class OrganisationDetailSerializer(serializers.ModelSerializer):
2727
class Meta:
2828
model = Organisation
2929
fields = ('name', 'slug', 'is_active')
30+
31+
32+
class MembershipSerializer(serializers.ModelSerializer):
33+
class Meta:
34+
model = Membership
35+
fields = ('joined', 'is_owner', 'role')
36+
37+
38+
class RetrieveOrganisationSerializer(serializers.ModelSerializer):
39+
membership_set = MembershipSerializer()
40+
41+
class Meta:
42+
model = Organisation
43+
fields = ('name', 'slug', 'is_active', 'membership_set')

demo/project/organisations/urls.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
urlpatterns = [
66

77
url(r'^create/$', view=views.CreateOrganisationView.as_view(), name="create"),
8+
url(r'^(?P<slug>[\w-]+)/$', view=views.RetrieveOrganisationView.as_view(), name="organisation"),
89
url(r'^(?P<slug>[\w-]+)/members/$', view=views.OrganisationMembersView.as_view(), name="members"),
910
url(r'^(?P<slug>[\w-]+)/leave/$', view=views.LeaveOrganisationView.as_view(), name="leave")
1011

demo/project/organisations/views.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,18 @@
22
from rest_framework.response import Response
33
from project.organisations.models import Organisation, Membership
44
from project.organisations.serializers import (
5-
CreateOrganisationSerializer, OrganisationMembersSerializer
5+
CreateOrganisationSerializer, OrganisationMembersSerializer, RetrieveOrganisationSerializer
66
)
77

88

9+
class RetrieveOrganisationView(generics.RetrieveAPIView):
10+
11+
serializer_class = RetrieveOrganisationSerializer
12+
13+
def get_object(self):
14+
pass
15+
16+
917
class CreateOrganisationView(generics.CreateAPIView):
1018

1119
serializer_class = CreateOrganisationSerializer

rest_framework_docs/api_endpoint.py

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import inspect
33
from django.contrib.admindocs.views import simplify_regex
44
from django.utils.encoding import force_str
5+
from rest_framework.serializers import BaseSerializer
56

67

78
class ApiEndpoint(object):
@@ -16,8 +17,12 @@ def __init__(self, pattern, parent_pattern=None):
1617
self.allowed_methods = self.__get_allowed_methods__()
1718
# self.view_name = pattern.callback.__name__
1819
self.errors = None
19-
self.fields = self.__get_serializer_fields__()
20-
self.fields_json = self.__get_serializer_fields_json__()
20+
self.serializer_class = self.__get_serializer_class__()
21+
if self.serializer_class:
22+
self.serializer = self.serializer_class()
23+
self.fields = self.__get_serializer_fields__(self.serializer)
24+
self.fields_json = self.__get_serializer_fields_json__()
25+
2126
self.permissions = self.__get_permissions_class__()
2227

2328
def __get_path__(self, parent_pattern):
@@ -35,23 +40,26 @@ def __get_permissions_class__(self):
3540
for perm_class in self.pattern.callback.cls.permission_classes:
3641
return perm_class.__name__
3742

38-
def __get_serializer_fields__(self):
39-
fields = []
40-
serializer = None
41-
43+
def __get_serializer_class__(self):
4244
if hasattr(self.callback.cls, 'serializer_class'):
43-
serializer = self.callback.cls.serializer_class
45+
return self.callback.cls.serializer_class
4446

45-
elif hasattr(self.callback.cls, 'get_serializer_class'):
46-
serializer = self.callback.cls.get_serializer_class(self.pattern.callback.cls())
47+
if hasattr(self.callback.cls, 'get_serializer_class'):
48+
return self.callback.cls.get_serializer_class(self.pattern.callback.cls())
49+
50+
def __get_serializer_fields__(self, serializer):
51+
fields = []
4752

4853
if hasattr(serializer, 'get_fields'):
4954
try:
50-
fields = [{
51-
"name": key,
52-
"type": str(field.__class__.__name__),
53-
"required": field.required
54-
} for key, field in serializer().get_fields().items()]
55+
for key, field in serializer.get_fields().items():
56+
sub_fields = self.__get_serializer_fields__(field) if isinstance(field, BaseSerializer) else None
57+
fields.append({
58+
"name": key,
59+
"type": str(field.__class__.__name__),
60+
"sub_fields": sub_fields,
61+
"required": field.required
62+
})
5563
except KeyError as e:
5664
self.errors = e
5765
fields = []
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<ul class="list fields">
2+
{% for field in fields %}
3+
<li class="field">
4+
{{ field.name }}: {{ field.type }}
5+
{% if field.required %}
6+
<span class="label label-primary label-required" title="Required">R</span>
7+
{% endif %}
8+
9+
{% if field.sub_fields %}
10+
{%include "rest_framework_docs/components/fields_list.html" with fields=field.sub_fields %}
11+
{% endif %}
12+
</li>
13+
{% endfor %}
14+
</ul>

rest_framework_docs/templates/rest_framework_docs/home.html

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,7 @@ <h4 class="panel-title title">
6565

6666
{% if endpoint.fields %}
6767
<p class="fields-desc">Fields:</p>
68-
<ul class="list fields">
69-
{% for field in endpoint.fields %}
70-
<li class="field">{{ field.name }}: {{ field.type }} {% if field.required %}<span class="label label-primary label-required" title="Required">R</span>{% endif %}</li>
71-
{% endfor %}
72-
</ul>
68+
{%include "rest_framework_docs/components/fields_list.html" with fields=endpoint.fields %}
7369
{% elif not endpoint.errors %}
7470
<p>No fields.</p>
7571
{% endif %}

0 commit comments

Comments
 (0)