Hi Basically I have followed the call all the way to the execution of the cursor.execute() on line 343 in models.fields.related.
I have not actually delved into the transaction method. However in my setup I am using the django admin, I have not set up any automatic transaction handling and the save method does is not transaction managed. Also I am running this on an existing object, and even if I was not, the primary key would have been created since the save method is called before I add new m2ms. Calling the super(Chapter,self).save() AFTER adding new m2ms is not needed, nor does it work. I also checked to make sure that the django.models.fields.related._remove_items() method is not called after the _add_items() method, to restore some previous state. My only conclusion is that somehow the transaction of the save() cancels out the transaction of the _add_items() method... Maybe it's the save.alters_data = True flag? or something to do with the dispatcher? I have not yet gone that deep into the source... But I can assure you that I am using as basic a setup as possible. It is simply django admin, MySQL with InnoDB and that very save method that you see in my initial post. So repeating this should not be a problem... I'll try to delve deeper into the transaction side of things, but any insight you can give me would be appreciated. //Dmitri On Nov 7, 2:25 am, Malcolm Tredinnick <[EMAIL PROTECTED]> wrote: > On Wed, 2007-11-07 at 00:50 +0000, Dmitri Fedortchenko wrote: > > Example code: > > > def save(self): > > regex = re.compile("\{\{([^\}]{2,60})\}\}") > > words = regex.findall(self.body) > > self.body = regex.sub("\\1",self.body) > > super(Chapter,self).save() > > for word in words: > > if len(word.strip()) > 0: > > try: > > self.keywords.create(value=word.strip().title()) > > except Exception, e: > > print e > > print self.keywords.all() # This prints the correct keywords! > > super(Chapter,self).save() > > > The outcome of this code is that new Keywords are created, but they > > are not bound to this Chapter. > > Simply calling chapter.keywords.create(value="Test") will indeed > > create a new keyword with the value "Test" bound to the chapter. I am > > running this from the django admin btw. > > Can you explain what is meant to be going on here? > > If you are trying to save m2m relations for an object that has not been > saved yet, you're out of luck. We need to know the current object's pk > value before it can be used in a m2m table and that isn't always > available (with auto primary keys). > > Normally, if you want to adjust the m2m relations for a model, hooking > into the post_save signal is the way to go. > > > > > The problem seems to be in the > > django.db.models.fields.related._add_items method, somewhere around > > line 340. > > The fact is that the insertion query is executed, but for some reason > > it is not committed, perhaps it is a transaction issue? > > Perhaps it is. Perhaps it isn't. How have you established the query was > executed? What does the commit_unless_managed() call end up doing in > your case? It might depend on your particular setup, too. Do some more > debugging and see what shows up if you think there's a problem there. > However, do keep in mind that it's generally impossible to do everything > with m2m's inside a model's save method because of the chicken-and-egg > problem with primary keys noted above. > > Regards, > Malcolm > > -- > Tolkien is hobbit-forming.http://www.pointy-stick.com/blog/ --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Django developers" group. To post to this group, send email to django-developers@googlegroups.com To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/django-developers?hl=en -~----------~----~----~----~------~----~------~--~---