Skip to content

Commit

Permalink
🐛 Issue fix for one-to-one field #91 (#92)
Browse files Browse the repository at this point in the history
* 🐛 Issue fix for one-to-one field #91

* ✨ one_to_one cascade support

Co-authored-by: Pratik Bodawala <pratik@propelius.tech>
  • Loading branch information
PratikBodawala and Pratik Bodawala committed Oct 2, 2022
1 parent 356800b commit e9d6ee1
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 3 deletions.
9 changes: 7 additions & 2 deletions softdelete/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import django

from django.conf import settings
from django.db.models import query
from django.db.models import query, OneToOneRel
from django.db import models, transaction
from django.core.exceptions import ObjectDoesNotExist
from django.contrib.contenttypes.models import ContentType
Expand Down Expand Up @@ -245,7 +245,12 @@ def delete(self, *args, **kwargs):
self._do_delete(cs, x)
if x.on_delete.__name__ == 'SET_NULL':
rel = x.get_accessor_name()
getattr(self, rel).all().update(**{x.remote_field.name: None})
if isinstance(x, OneToOneRel):
if not getattr(self, rel, None):
continue
setattr(getattr(self, rel), x.remote_field.name, None)
else:
getattr(self, rel).all().update(**{x.remote_field.name: None})
logging.debug("FINISHED SOFT DELETING RELATED %s", self)
models.signals.post_delete.send(sender=self.__class__,
instance=self,
Expand Down
23 changes: 23 additions & 0 deletions softdelete/test_softdelete_app/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,29 @@ class TestModelThrough(SoftDeleteObject):
)


class TestModelBaseO2OMale(SoftDeleteObject):
name = models.CharField(max_length=16)


class TestModelO2OFemaleSetNull(SoftDeleteObject):
name = models.CharField(max_length=16)
link = models.OneToOneField(
TestModelBaseO2OMale,
related_name='one_to_one_set_null',
on_delete=models.SET_NULL,
null=True,
)


class TestModelO2OFemaleCascade(SoftDeleteObject):
name = models.CharField(max_length=16)
link = models.OneToOneField(
TestModelBaseO2OMale,
related_name='one_to_one_cascade',
on_delete=models.CASCADE,
)


admin.site.register(TestModelOne, SoftDeleteObjectAdmin)
admin.site.register(TestModelTwoCascade, SoftDeleteObjectAdmin)
admin.site.register(TestModelTwoSetNull, SoftDeleteObjectAdmin)
Expand Down
18 changes: 17 additions & 1 deletion softdelete/tests/test_sd.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from django.contrib.auth.models import User
from django.db import models
from softdelete.test_softdelete_app.models import TestModelOne, TestModelTwoCascade, TestModelThree, TestModelThrough, \
TestModelTwoDoNothing, TestModelTwoSetNull
TestModelTwoDoNothing, TestModelTwoSetNull, TestModelO2OFemaleSetNull, TestModelBaseO2OMale, TestModelO2OFemaleCascade
from softdelete.tests.constanats import TEST_MODEL_ONE_COUNT, TEST_MODEL_TWO_TOTAL_COUNT, TEST_MODEL_THREE_COUNT, \
TEST_MODEL_TWO_LIST, TEST_MODEL_TWO_CASCADE_COUNT, TEST_MODEL_TWO_SET_NULL_COUNT, TEST_MODEL_TWO_DO_NOTHING_COUNT
from softdelete.models import *
Expand Down Expand Up @@ -351,3 +351,19 @@ def test_related_m2m(self):
t31.delete()
self.assertRaises(TestModelThree.DoesNotExist,
self.tmo1.testmodelthree_set.get, extra_int=100)

def test_one_to_one(self):
bob = TestModelBaseO2OMale.objects.create(name='Bob')
alice = TestModelO2OFemaleSetNull.objects.create(name='Alice', link=bob)

bob.delete()

self.assertEquals(alice.link_id, None)

romeo = TestModelBaseO2OMale.objects.create(name='Romeo')
juliet = TestModelO2OFemaleCascade.objects.create(name='Juliet', link=romeo)

romeo.delete()

self.assertRaises(TestModelO2OFemaleCascade.DoesNotExist, TestModelO2OFemaleCascade.objects.get, name='Juliet')
self.assertEquals(juliet.deleted, True)

0 comments on commit e9d6ee1

Please sign in to comment.