Skip to content

Commit 187057f

Browse files
committed
Added test to check for relationship view relationship types and patch accordingly and updated relationship functionality for related fields
1 parent bda8f63 commit 187057f

File tree

2 files changed

+60
-2
lines changed

2 files changed

+60
-2
lines changed

example/tests/test_views.py

+37-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
from . import TestBase
1313
from .. import views
14-
from example.factories import AuthorFactory, EntryFactory
14+
from example.factories import AuthorFactory, EntryFactory, CommentFactory
1515
from example.models import Author, Blog, Comment, Entry
1616
from example.serializers import AuthorBioSerializer, AuthorTypeSerializer, EntrySerializer
1717
from example.views import AuthorViewSet
@@ -229,6 +229,42 @@ def test_delete_to_many_relationship_with_change(self):
229229
response = self.client.delete(url, data=request_data)
230230
assert response.status_code == 200, response.content.decode()
231231

232+
def test_new_comment_data_patch_to_many_relationship(self):
233+
entry = EntryFactory(blog=self.blog, authors=(self.author,))
234+
comment = CommentFactory(entry=entry)
235+
236+
url = '/authors/{}/relationships/comment_set'.format(self.author.id)
237+
request_data = {
238+
'data': [{'type': format_resource_type('Comment'), 'id': str(comment.id)}, ]
239+
}
240+
previous_response = {
241+
'data': [
242+
{'type': 'comments',
243+
'id': f'{self.second_comment.id}'
244+
}
245+
],
246+
'links': {'self': f'http://testserver/authors/{self.author.id}/relationships/comment_set'}
247+
}
248+
249+
response = self.client.get(url)
250+
assert response.status_code == 200
251+
assert response.json() == previous_response
252+
253+
new_patched_response = {
254+
'data': [
255+
{'type': 'comments',
256+
'id': f'{comment.id}'
257+
}
258+
],
259+
'links': {'self': f'http://testserver/authors/{self.author.id}/relationships/comment_set'}
260+
}
261+
262+
response = self.client.patch(url, data=request_data)
263+
assert response.status_code == 200
264+
assert response.json() == new_patched_response
265+
266+
assert Comment.objects.filter(id=self.second_comment.id).exists
267+
232268

233269
class TestRelatedMixin(APITestCase):
234270

rest_framework_json_api/views.py

+23-1
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,18 @@ def get(self, request, *args, **kwargs):
251251
serializer_instance = self._instantiate_serializer(related_instance)
252252
return Response(serializer_instance.data)
253253

254+
def remove_relationships(self, instance_manager, field):
255+
field_object = getattr(instance_manager, field)
256+
257+
if getattr(field_object, "null"):
258+
for obj in instance_manager.all():
259+
setattr(obj, field_object.name, None)
260+
obj.save()
261+
else:
262+
instance_manager.all().delete()
263+
264+
return instance_manager
265+
254266
def patch(self, request, *args, **kwargs):
255267
parent_obj = self.get_object()
256268
related_instance_or_manager = self.get_related_instance()
@@ -261,7 +273,17 @@ def patch(self, request, *args, **kwargs):
261273
data=request.data, model_class=related_model_class, many=True
262274
)
263275
serializer.is_valid(raise_exception=True)
264-
related_instance_or_manager.all().delete()
276+
# related_instance_or_manager.all().delete()
277+
278+
# for to one
279+
if hasattr(related_instance_or_manager, "field"):
280+
related_instance_or_manager = self.remove_relationships(instance_manager=related_instance_or_manager,
281+
field="field")
282+
# for to many
283+
else:
284+
related_instance_or_manager = self.remove_relationships(instance_manager=related_instance_or_manager,
285+
field="target_field")
286+
265287
# have to set bulk to False since data isn't saved yet
266288
class_name = related_instance_or_manager.__class__.__name__
267289
if class_name != 'ManyRelatedManager':

0 commit comments

Comments
 (0)