#28732: Deleted OneToOneRelation still referenced (not None) after
refresh_from_db
-------------------------------------+-------------------------------------
Reporter: | Owner: nobody
JeroenPeterBos |
Type: Bug | Status: new
Component: Database | Version: 1.9
layer (models, ORM) | Keywords: Refresh Database
Severity: Normal | Object Delete
Triage Stage: | Has patch: 0
Unreviewed |
Needs documentation: 0 | Needs tests: 0
Patch needs improvement: 0 | Easy pickings: 0
UI/UX: 0 |
-------------------------------------+-------------------------------------
**Issue:**
I ran into the following problem. I have a test that will retrieve an
account which has a relation to ActivationCode. In the test i call a
function that recieves a string with which it can find the activationcode,
after that the funciton will call delete on the ActivationCode. Now the
problem is, when i call refresh_from_db() on the account it will say that
account still has a related Activation Code ( while it obviously hasn't )
and the problem is proved when i call on this related ActivationCode,
because a DoesNotExist exception will be thrown.
In my oppinion also this deleted relation object should be reflected in
account when refreshing it.
''Below is the relevant code''
**Models**
{{{
class Account(models.Model):
user = models.OneToOneField(User)
activated = models.BooleanField(default=False)
class ActivationCode(models.Model):
account = models.OneToOneField(Account, unique=True)
code = models.CharField(max_length=128)
timestamp = models.DateTimeField(auto_now_add=True)
}}}
**Controller**
{{{
def confirm(confirmData: dict) -> bool:
"""
Activates the account associated with the given code.
:param confirmData: The data needed to confirm the account.
:return: Whether the activation was successful.
"""
form = forms.ConfirmForm(confirmData)
if not form.is_valid():
return False
data = form.cleaned_data
try:
confirmObject = ActivationCode.objects.get(code=data['code'])
except ActivationCode.DoesNotExist:
return False
confirmObject.account.activated = True
confirmObject.account.save()
confirmObject.delete()
return True
}}}
**The test that failes**
{{{
class ActivateTest(TestCase):
def setUp(self):
controller.register(testUser)
def testActivateSingleUser(self):
account = User.objects.get(username=testUser['username']).account
success = controller.confirm({'code':
account.activationcode.code})
account.refresh_from_db()
self.assertTrue(success)
self.assertTrue(account.activated)
# account.activationcode.refresh_from_db() # uncommenting this
line will result in a DoesNotExist exception
self.assertFalse(hasattr(account, 'activationcode')) # This test
fails.
}}}
**Finally the Traceback**
{{{
FAIL: testActivateSingleUser (Main.tests.ActivateTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\Users\Path\To\Project\Main\tests.py", line 53, in
testActivateSingleUser
self.assertFalse(hasattr(account, 'activationcode'))
AssertionError: True is not false
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/28732>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/057.8378a982bb4ff579c8d2c1ffb756059d%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.