From f82c95a623a2d5252380fc9bc245ad8b6c8296ba Mon Sep 17 00:00:00 2001 From: Anton-Shutik Date: Fri, 15 Apr 2016 11:03:37 +0300 Subject: [PATCH 1/2] Added get_related_field_name method to RelationshipView --- rest_framework_json_api/views.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/rest_framework_json_api/views.py b/rest_framework_json_api/views.py index a43fad89..4b6e631a 100644 --- a/rest_framework_json_api/views.py +++ b/rest_framework_json_api/views.py @@ -19,6 +19,7 @@ class RelationshipView(generics.GenericAPIView): serializer_class = ResourceIdentifierObjectSerializer self_link_view_name = None related_link_view_name = None + field_name_mapping = {} def get_serializer_class(self): if getattr(self, 'action', False) is None: @@ -96,7 +97,7 @@ def patch(self, request, *args, **kwargs): related_model_class = related_instance_or_manager.__class__ serializer = self.get_serializer(data=request.data, model_class=related_model_class) serializer.is_valid(raise_exception=True) - setattr(parent_obj, kwargs['related_field'], serializer.validated_data) + setattr(parent_obj, self.get_related_field_name(), serializer.validated_data) parent_obj.save() result_serializer = self._instantiate_serializer(related_instance_or_manager) return Response(result_serializer.data) @@ -138,10 +139,16 @@ def delete(self, request, *args, **kwargs): def get_related_instance(self): try: - return getattr(self.get_object(), self.kwargs['related_field']) + return getattr(self.get_object(), self.get_related_field_name()) except AttributeError: raise NotFound + def get_related_field_name(self): + field_name = self.kwargs['related_field'] + if field_name in self.field_name_mapping: + return self.field_name_mapping[field_name] + return field_name + def _instantiate_serializer(self, instance): if isinstance(instance, Model) or instance is None: return self.get_serializer(instance=instance) @@ -153,7 +160,7 @@ def _instantiate_serializer(self, instance): def get_resource_name(self): if not hasattr(self, '_resource_name'): - instance = getattr(self.get_object(), self.kwargs['related_field']) + instance = getattr(self.get_object(), self.get_related_field_name()) self._resource_name = get_resource_type_from_instance(instance) return self._resource_name From 31afad4efb8e94d8f9c5f72815a117775b0e9cbb Mon Sep 17 00:00:00 2001 From: Anton-Shutik Date: Mon, 18 Apr 2016 11:14:50 +0300 Subject: [PATCH 2/2] Added docs about field_name_mapping --- docs/usage.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/usage.md b/docs/usage.md index c4879956..75ab712d 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -413,6 +413,15 @@ model field `Order.line_items` on the Order with pk 3, the url would be `self_link_view_name` keyword argument, which should match the `name=` provided in the urlconf, and will use the name of the field for the `related_field` kwarg. +Also we can override `related_field` in the url. Let's say we want the url to be: +`/order/3/relationships/order_items` - all we need to do is just add `field_name_mapping` +dict to the class: +```python +field_name_mapping = { + 'line_items': 'order_items' + } +``` + ### Meta