Fixed #7778 -- Fixed a tricky case of foreign key clearing with inherited
models. Patch from James Murty. git-svn-id: http://code.djangoproject.com/svn/django/trunk@8100 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
ccab4b041b
commit
3cbe73692e
1
AUTHORS
1
AUTHORS
|
@ -280,6 +280,7 @@ answer newbie questions, and generally made Django that much better:
|
||||||
Eric Moritz <http://eric.themoritzfamily.com/>
|
Eric Moritz <http://eric.themoritzfamily.com/>
|
||||||
mrmachine <real.human@mrmachine.net>
|
mrmachine <real.human@mrmachine.net>
|
||||||
Robin Munn <http://www.geekforgod.com/>
|
Robin Munn <http://www.geekforgod.com/>
|
||||||
|
James Murty
|
||||||
msundstr
|
msundstr
|
||||||
Robert Myers <myer0052@gmail.com>
|
Robert Myers <myer0052@gmail.com>
|
||||||
Nebojša Dorđević
|
Nebojša Dorđević
|
||||||
|
|
|
@ -836,7 +836,9 @@ def delete_objects(seen_objs):
|
||||||
|
|
||||||
update_query = sql.UpdateQuery(cls, connection)
|
update_query = sql.UpdateQuery(cls, connection)
|
||||||
for field in cls._meta.fields:
|
for field in cls._meta.fields:
|
||||||
if field.rel and field.null and field.rel.to in seen_objs:
|
if (field.rel and field.null and field.rel.to in seen_objs and
|
||||||
|
filter(lambda f: f.column == field.column,
|
||||||
|
field.rel.to._meta.fields)):
|
||||||
update_query.clear_related(field, pk_list)
|
update_query.clear_related(field, pk_list)
|
||||||
|
|
||||||
# Now delete the actual data.
|
# Now delete the actual data.
|
||||||
|
|
|
@ -190,6 +190,19 @@ class CustomPk(models.Model):
|
||||||
class Related(models.Model):
|
class Related(models.Model):
|
||||||
custom = models.ForeignKey(CustomPk)
|
custom = models.ForeignKey(CustomPk)
|
||||||
|
|
||||||
|
# An inter-related setup with a model subclass that has a nullable
|
||||||
|
# path to another model, and a return path from that model.
|
||||||
|
|
||||||
|
class Celebrity(models.Model):
|
||||||
|
name = models.CharField("Name", max_length=20)
|
||||||
|
greatest_fan = models.ForeignKey("Fan", null=True, unique=True)
|
||||||
|
|
||||||
|
class TvChef(Celebrity):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class Fan(models.Model):
|
||||||
|
fan_of = models.ForeignKey(Celebrity)
|
||||||
|
|
||||||
|
|
||||||
__test__ = {'API_TESTS':"""
|
__test__ = {'API_TESTS':"""
|
||||||
>>> t1 = Tag.objects.create(name='t1')
|
>>> t1 = Tag.objects.create(name='t1')
|
||||||
|
@ -836,6 +849,21 @@ related via ForeignKeys.
|
||||||
>>> len(Note.objects.order_by('extrainfo__info').distinct())
|
>>> len(Note.objects.order_by('extrainfo__info').distinct())
|
||||||
3
|
3
|
||||||
|
|
||||||
|
Bug #7778 - Model subclasses could not be deleted if a nullable foreign key
|
||||||
|
relates to a model that relates back.
|
||||||
|
|
||||||
|
>>> num_celebs = Celebrity.objects.count()
|
||||||
|
>>> tvc = TvChef.objects.create(name="Huey")
|
||||||
|
>>> Celebrity.objects.count() == num_celebs + 1
|
||||||
|
True
|
||||||
|
>>> f1 = Fan.objects.create(fan_of=tvc)
|
||||||
|
>>> f2 = Fan.objects.create(fan_of=tvc)
|
||||||
|
>>> tvc.delete()
|
||||||
|
|
||||||
|
# The parent object should have been deleted as well.
|
||||||
|
>>> Celebrity.objects.count() == num_celebs
|
||||||
|
True
|
||||||
|
|
||||||
"""}
|
"""}
|
||||||
|
|
||||||
# In Python 2.3, exceptions raised in __len__ are swallowed (Python issue
|
# In Python 2.3, exceptions raised in __len__ are swallowed (Python issue
|
||||||
|
|
Loading…
Reference in New Issue