44from rest_framework .response import Response
55from rest_framework .renderers import JSONRenderer
66from rest_framework_json_api .serializers import ResourceIdentifierObjectSerializer
7+ from rest_framework_json_api .utils import format_relation_name , get_resource_type_from_instance
78from rest_framework .exceptions import NotFound
89
910
@@ -12,36 +13,48 @@ class RelationshipView(generics.GenericAPIView):
1213 renderer_classes = (JSONRenderer , )
1314
1415 def get (self , request , * args , ** kwargs ):
15- related_instance = self .get_related_instance (kwargs )
16- serializer_instance = self .instantiate_serializer (related_instance )
16+ related_instance = self .get_related_instance ()
17+ serializer_instance = self ._instantiate_serializer (related_instance )
1718 return Response (serializer_instance .data )
1819
19- def put (self , request , * args , ** kwargs ):
20- return Response ()
21-
2220 def patch (self , request , * args , ** kwargs ):
23- return Response ()
21+ parent_obj = self .get_object ()
22+ if hasattr (parent_obj , kwargs ['related_field' ]):
23+ related_model_class = self .get_related_instance ().__class__
24+ serializer = self .get_serializer (data = request .data , model_class = related_model_class )
25+ serializer .is_valid (raise_exception = True )
26+ setattr (parent_obj , kwargs ['related_field' ], serializer .validated_data )
27+ parent_obj .save ()
28+ return Response (serializer .data )
2429
2530 def post (self , request , * args , ** kwargs ):
2631 return Response ()
2732
2833 def delete (self , request , * args , ** kwargs ):
2934 return Response ()
3035
31- def get_related_instance (self , kwargs ):
36+ def get_related_instance (self ):
3237 try :
33- return getattr (self .get_object (), kwargs ['related_field' ])
38+ return getattr (self .get_object (), self . kwargs ['related_field' ])
3439 except AttributeError :
3540 raise NotFound
3641
37- def instantiate_serializer (self , instance ):
38- serializer_class = self .get_serializer_class ()
42+ def _instantiate_serializer (self , instance ):
3943 if isinstance (instance , Model ):
40- return serializer_class (instance = instance )
44+ return self . get_serializer (instance = instance )
4145 else :
4246 if isinstance (instance , (QuerySet , BaseManager )):
4347 instance = instance .all ()
4448
45- return serializer_class (instance = instance , many = True )
49+ return self .get_serializer (instance = instance , many = True )
50+
51+ def get_resource_name (self ):
52+ if not hasattr (self , '_resource_name' ):
53+ instance = getattr (self .get_object (), self .kwargs ['related_field' ])
54+ self ._resource_name = format_relation_name (get_resource_type_from_instance (instance ))
55+ return self ._resource_name
4656
57+ def set_resource_name (self , value ):
58+ self ._resource_name = value
4759
60+ resource_name = property (get_resource_name , set_resource_name )
0 commit comments