#14075: ManyToMany relationships create circular references
---------------------------+------------------------------------------------
 Reporter:  candrea        |       Owner:  nobody    
   Status:  new            |   Milestone:            
Component:  Uncategorized  |     Version:  1.2       
 Keywords:                 |       Stage:  Unreviewed
Has_patch:  0              |  
---------------------------+------------------------------------------------
 Here is how you can reproduce the problem:

 1. First, download the attached tar.gz which contains a simple Django
 project with an app. The important file is models.py, that contains the
 m2m relationship.

 2. Open a Python console and enable DEBUG_SAVEALL in the GC:
 {{{
     >>> import gc
     >>> gc.set_debug(gc.DEBUG_SAVEALL)
 }}}
 3. Import the 'models' module from the Django app:
 {{{
     >>> from testproj.testapp import models
 }}}
 4. Run a full collection and check the garbage:
 {{{
     >>> gc.collect()
     6
     >>> gc.garbage
     [..., <class 'django.db.models.fields.related.Meta'>, ...]
 }}}

 In most of the cases this isn't a problem, because the GC without
 DEBUG_SAVEALL automatically deletes such objects. However this becomes an
 issue when you want to disable the garbage collector to increase
 performances a bit. This problem is caused by the fact that creating a
 Python's new-style class creates circular references and in fact 'Meta' is
 a new-style class.

 I see that this problem occurs for almost every operation that involves a
 many-to-many relationships: the Meta class is created (sometimes more than
 one time) and then is deleted. To avoid the problem, I think that Meta
 shouldn't be a temporary class, but should be saved somewhere in the
 model, so that it will never be deleted till the interpreter exits (or the
 model is destroyed). Using a dictionary instead of a class may solve the
 problem too.

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