#9741: generic relations: reverse chain of references not followed fully yon
delete
-----------------------------------------------+----------------------------
 Reporter:  wiswaud                            |       Owner:  nobody    
   Status:  new                                |   Milestone:            
Component:  Contrib apps                       |     Version:  1.0       
 Keywords:  genericrelation genericforeignkey  |       Stage:  Unreviewed
Has_patch:  0                                  |  
-----------------------------------------------+----------------------------
 If i have an object c, which has a genericforeignkey relation to b, which
 in turn has a genericforeignkey relation to a, and i delete a, b does get
 deleted, but not c. If i were to delete b, c does get deleted.

 If these were foreign keys, the chain of reverse relations would get
 properly deleted, but for genericrelations, it only goes back 1 link.

 {{{
 from django.db import models
 from django.contrib.contenttypes.models import ContentType
 from django.contrib.contenttypes import generic

 class A(models.Model):
     t = models.CharField(max_length=50)
     gr_b_reverse = generic.GenericRelation('GR_B')

 class FK_B(models.Model):
     """An object with a foreign key, that we'll point to an A"""
     fk = models.ForeignKey('A')

 class FK_C(models.Model):
     """An object with a foreign key, that we'll point to a FK_B"""
     fk = models.ForeignKey('FK_B')

 class GR_B(models.Model):
     """An object with a generic key, that we'll point to an A"""
     content_type = models.ForeignKey(ContentType)
     object_id = models.PositiveIntegerField()
     content_obj = generic.GenericForeignKey(ct_field="content_type",
                                             fk_field="object_id")
     gr_c_reverse = generic.GenericRelation('GR_C')

 class GR_C(models.Model):
     """An object with a generic key, that we'll point to a GR_B

     # test proper deletion of gr_c pointing to gr_b if we delete gr_b
     >>> a=A.objects.create(t='foo')
     >>> gr_b=GR_B.objects.create(content_obj=a)
     >>> gr_c=GR_C.objects.create(content_obj=gr_b)
     >>> gr_b.delete()
     >>> print A.objects.all(), GR_B.objects.all(), GR_C.objects.all()
     [<A: A object>] [] []
     >>> a.delete()

     # test proper deletion of gr_b pointing to a if we delete a
     >>> a=A.objects.create(t='foo')
     >>> gr_b=GR_B.objects.create(content_obj=a)
     >>> a.delete()
     >>> print A.objects.all(), GR_B.objects.all()
     [] []

     # test proper deletion of fk_b pointing to a, fk_c pointing to b, gr_b
 pointing
     # to a, and gr_c pointing to gr_b if we delete a
     >>> a=A.objects.create(t='foo')
     >>> gr_b=GR_B.objects.create(content_obj=a)
     >>> gr_c=GR_C.objects.create(content_obj=gr_b)
     >>> fk_b=FK_B.objects.create(fk=a)
     >>> fk_c=FK_C.objects.create(fk=fk_b)
     >>> print A.objects.all(), GR_B.objects.all(), GR_C.objects.all(),
 FK_B.objects.all(), FK_C.objects.all()
     [<A: A object>] [<GR_B: GR_B object>] [<GR_C: GR_C object>] [<FK_B:
 FK_B object>] [<FK_C: FK_C object>]
     >>> a.delete()
     >>> print A.objects.all(), GR_B.objects.all(), GR_C.objects.all(),
 FK_B.objects.all(), FK_C.objects.all()
     [] [] [] [] []

     # FAIL! we instead get:
     # [] [] [<GR_C: GR_C object>] [] []
     """

     content_type = models.ForeignKey(ContentType)
     object_id = models.PositiveIntegerField()
     content_obj = generic.GenericForeignKey(ct_field="content_type",
                                             fk_field="object_id")

 }}}

-- 
Ticket URL: <http://code.djangoproject.com/ticket/9741>
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
-~----------~----~----~----~------~----~------~--~---

Reply via email to