#14043: Incorrect and/or confusing behaviour with nullable OneToOneField
-------------------------------------------------------+--------------------
Reporter: theevilgeek | Owner: nobody
Status: new | Milestone:
Component: Database layer (models, ORM) | Version: SVN
Keywords: OneToOneField, cascading delete, nullable | Stage:
Unreviewed
Has_patch: 0 |
-------------------------------------------------------+--------------------
Attempting to "null" out a nullable OneToOneField before deleting the
related object fails to prevent a cascading delete (i.e., both objects are
still deleted whereas it seems only the related object ought to be
deleted).
Example code:
{{{
# Note: using Django trunk
###### MODELS ######
class Person(models.Model):
age = models.PositiveIntegerField()
def die(self):
self.soul.become_ghost()
self.delete()
class Soul(models.Model):
person = models.OneToOneField(Person, null=True)
is_alive = models.BooleanField(default=True)
def become_ghost(self):
self.person = None
self.is_alive = False
self.save()
###### TESTCASE (INTERACTIVE) ######
# Type a few commands in "python manage.py shell"
>>> from app.models import Person, Soul
>>>
>>> bob = Person.objects.create(age=34)
>>> bobs_soul = Soul.objects.create(person=bob)
# Let's see what's happening in MySQL (switching programs...)
mysql> select * from app_person;
+----+-----+
| id | age |
+----+-----+
| 2 | 34 |
+----+-----+
1 row in set (0.00 sec)
mysql> select * from app_soul;
+----+-----------+----------+
| id | person_id | is_alive |
+----+-----------+----------+
| 2 | 2 | 1 |
+----+-----------+----------+
1 row in set (0.00 sec)
# Okay, that looks good; let's kill him (switching programs again...)
>>> bob.die()
# Back to MySQL
mysql> select * from app_person;
Empty set (0.00 sec)
mysql> select * from app_soul;
Empty set (0.00 sec)
### Huh!??! Why is app_soul being deleted?
}}}
--
Ticket URL: <http://code.djangoproject.com/ticket/14043>
Django <http://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 post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/django-updates?hl=en.