From 59323ab76b26930101f3c15805538bd85cc3d33b Mon Sep 17 00:00:00 2001 From: amartis Date: Fri, 18 Feb 2022 01:08:17 +0800 Subject: [PATCH 1/2] Bug fix: prevent newly added (child) instances from being deleted soon after. When the Bug is happening: This happens when the request was made as mutlipart-form. Where the request data is not multi-layer dictionary, but instead plain HTTP multipart-form. Cause of Bug: The cause of the bug was the use of get_initial() to store primary keys (pk) in `update_or_create_reverse_relations()` get_initial() returns whole new object when the data is not nested dictionary but multipart-form where the key looks like `profile[0]message_set[0]message` And thus storing pk in that object is not persisted for `delete_reverse_relations_if_need()` Solution: Use attribute `nodelete_pks` to persist the data. --- drf_writable_nested/mixins.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/drf_writable_nested/mixins.py b/drf_writable_nested/mixins.py index d3dc4c4..b75258d 100644 --- a/drf_writable_nested/mixins.py +++ b/drf_writable_nested/mixins.py @@ -185,6 +185,10 @@ def update_or_create_reverse_relations(self, instance, reverse_relations): try: serializer.is_valid(raise_exception=True) related_instance = serializer.save(**save_kwargs) + if not hasattr(self, 'nodelete_pks'): + self.nodelete_pks = {} + self.nodelete_pks[field_name] = self.nodelete_pks.get(field_name, []) + self.nodelete_pks[field_name].append(related_instance.pk) data['pk'] = related_instance.pk new_related_instances.append(related_instance) errors.append({}) @@ -329,7 +333,13 @@ def delete_reverse_relations_if_need(self, instance, reverse_relations): related_field.name: instance, } - current_ids = self._extract_related_pks(field, related_data) + if not hasattr(self, 'nodelete_pks'): + current_ids = self._extract_related_pks(field, related_data) + else: + current_ids = self.nodelete_pks.get( + field_name, + self._extract_related_pks(field, related_data) + ) try: pks_to_delete = list( From 8bdc05686cdee69e778de870af070e3906dc920c Mon Sep 17 00:00:00 2001 From: amartis Date: Fri, 18 Feb 2022 01:45:14 +0800 Subject: [PATCH 2/2] Upgrade version --- drf_writable_nested/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drf_writable_nested/__init__.py b/drf_writable_nested/__init__.py index ca0b55c..d3b8bb4 100644 --- a/drf_writable_nested/__init__.py +++ b/drf_writable_nested/__init__.py @@ -1,5 +1,5 @@ __title__ = 'DRF writable nested' -__version__ = '0.6.3' +__version__ = '0.6.4' __author__ = 'beda.software' __license__ = 'BSD 2-Clause' __copyright__ = 'Copyright 2014-2020 beda.software'