Skip to content

Commit 6e5d995

Browse files
rohithprsliverc
andauthored
Clear m2m relationships instead of deleting related objects during PATCH (#788)
Fixes #784 Fixes #244 Co-authored-by: Oliver Sauder <os@esite.ch>
1 parent f87eeaf commit 6e5d995

File tree

4 files changed

+32
-0
lines changed

4 files changed

+32
-0
lines changed

AUTHORS

+1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ Ola Tarkowska <ola@red-aries.com>
1717
Oliver Sauder <os@esite.ch>
1818
Raphael Cohen <raphael.cohen.utt@gmail.com>
1919
Roberto Barreda <roberto.barreda@gmail.com>
20+
Rohith PR <praroh2@gmail.com>
2021
santiavenda <santiavenda2@gmail.com>
2122
Tim Selman <timcbaoth@gmail.com>
2223
Yaniv Peer <yanivpeer@gmail.com>

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ any parts of the framework not mentioned in the documentation should generally b
1717
### Fixed
1818

1919
* Avoid `AttributeError` for PUT and PATCH methods when using `APIView`
20+
* Clear many-to-many relationships instead of deleting related objects during PATCH on `RelationshipView`
2021

2122
### Changed
2223

example/tests/test_views.py

+28
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,26 @@ def test_patch_one_to_many_relationship(self):
135135
response = self.client.get(url)
136136
assert response.data == request_data['data']
137137

138+
# retry a second time should end up with same result
139+
response = self.client.patch(url, data=request_data)
140+
assert response.status_code == 200, response.content.decode()
141+
assert response.data == request_data['data']
142+
143+
response = self.client.get(url)
144+
assert response.data == request_data['data']
145+
146+
def test_patch_one_to_many_relaitonship_with_none(self):
147+
url = '/blogs/{}/relationships/entry_set'.format(self.first_entry.id)
148+
request_data = {
149+
'data': None
150+
}
151+
response = self.client.patch(url, data=request_data)
152+
assert response.status_code == 200, response.content.decode()
153+
assert response.data == []
154+
155+
response = self.client.get(url)
156+
assert response.data == []
157+
138158
def test_patch_many_to_many_relationship(self):
139159
url = '/entries/{}/relationships/authors'.format(self.first_entry.id)
140160
request_data = {
@@ -152,6 +172,14 @@ def test_patch_many_to_many_relationship(self):
152172
response = self.client.get(url)
153173
assert response.data == request_data['data']
154174

175+
# retry a second time should end up with same result
176+
response = self.client.patch(url, data=request_data)
177+
assert response.status_code == 200, response.content.decode()
178+
assert response.data == request_data['data']
179+
180+
response = self.client.get(url)
181+
assert response.data == request_data['data']
182+
155183
def test_post_to_one_relationship_should_fail(self):
156184
url = '/entries/{}/relationships/blog'.format(self.first_entry.id)
157185
request_data = {

rest_framework_json_api/views.py

+2
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,8 @@ def remove_relationships(self, instance_manager, field):
286286
for obj in instance_manager.all():
287287
setattr(obj, field_object.name, None)
288288
obj.save()
289+
elif hasattr(instance_manager, 'clear'):
290+
instance_manager.clear()
289291
else:
290292
instance_manager.all().delete()
291293

0 commit comments

Comments
 (0)