diff options
| author | Malcolm Tredinnick <malcolm.tredinnick@gmail.com> | 2009-03-20 03:57:12 +0000 |
|---|---|---|
| committer | Malcolm Tredinnick <malcolm.tredinnick@gmail.com> | 2009-03-20 03:57:12 +0000 |
| commit | fa89fdcd6b4a4ab4887740c0d0f4a73297a5b060 (patch) | |
| tree | d32b42ab5121a4014b420e70f86c26c4d2222457 /tests | |
| parent | 44b0f68f44c4e5ca6f2b9da294dab1db531abc6e (diff) | |
Fixed #2698 -- Fixed deleting in the presence of custom managers.
A custom manager on a related object that filtered away objects would prevent
those objects being deleted via the relation. This is now fixed.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@10104 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/regressiontests/custom_managers_regress/models.py | 52 |
1 files changed, 48 insertions, 4 deletions
diff --git a/tests/regressiontests/custom_managers_regress/models.py b/tests/regressiontests/custom_managers_regress/models.py index 67fed84447..898730ea9a 100644 --- a/tests/regressiontests/custom_managers_regress/models.py +++ b/tests/regressiontests/custom_managers_regress/models.py @@ -11,9 +11,27 @@ class RestrictedManager(models.Manager): def get_query_set(self): return super(RestrictedManager, self).get_query_set().filter(is_public=True) -class RestrictedClass(models.Model): +class RelatedModel(models.Model): + name = models.CharField(max_length=50) + + def __unicode__(self): + return self.name + +class RestrictedModel(models.Model): + name = models.CharField(max_length=50) + is_public = models.BooleanField(default=False) + related = models.ForeignKey(RelatedModel) + + objects = RestrictedManager() + plain_manager = models.Manager() + + def __unicode__(self): + return self.name + +class OneToOneRestrictedModel(models.Model): name = models.CharField(max_length=50) is_public = models.BooleanField(default=False) + related = models.OneToOneField(RelatedModel) objects = RestrictedManager() plain_manager = models.Manager() @@ -24,15 +42,41 @@ class RestrictedClass(models.Model): __test__ = {"tests": """ Even though the default manager filters out some records, we must still be able to save (particularly, save by updating existing records) those filtered -instances. This is a regression test for #FIXME. ->>> obj = RestrictedClass.objects.create(name="hidden") +instances. This is a regression test for #8990, #9527 +>>> related = RelatedModel.objects.create(name="xyzzy") +>>> obj = RestrictedModel.objects.create(name="hidden", related=related) >>> obj.name = "still hidden" >>> obj.save() # If the hidden object wasn't seen during the save process, there would now be # two objects in the database. ->>> RestrictedClass.plain_manager.count() +>>> RestrictedModel.plain_manager.count() 1 +Deleting related objects should also not be distracted by a restricted manager +on the related object. This is a regression test for #2698. +>>> RestrictedModel.plain_manager.all().delete() +>>> for name, public in (('one', True), ('two', False), ('three', False)): +... _ = RestrictedModel.objects.create(name=name, is_public=public, related=related) + +# Reload the RelatedModel instance, just to avoid any instance artifacts. +>>> obj = RelatedModel.objects.get(name="xyzzy") +>>> obj.delete() + +# All of the RestrictedModel instances should have been deleted, since they +# *all* pointed to the RelatedModel. If the default manager is used, only the +# public one will be deleted. +>>> RestrictedModel.plain_manager.all() +[] + +# The same test case as the last one, but for one-to-one models, which are +# implemented slightly different internally, so it's a different code path. +>>> obj = RelatedModel.objects.create(name="xyzzy") +>>> _ = OneToOneRestrictedModel.objects.create(name="foo", is_public=False, related=obj) +>>> obj = RelatedModel.objects.get(name="xyzzy") +>>> obj.delete() +>>> OneToOneRestrictedModel.plain_manager.all() +[] + """ } |
