Skip to content

Commit dfaa30d

Browse files
Alig1493Oliver Sauder
authored and
Oliver Sauder
committed
Added test to check for relationship view relationship types and patch accordingly and updated relationship functionality for related fields
1 parent 00fb5dc commit dfaa30d

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)