Loading...

Experience Renaming Deployed Django Apps

October 16, 2007 4 Comments Tagged as: django django-tagging howto refactoring

I've released yet another iteration of The Iron Lion, with the key of this new release being my new knowledge of the newforms library. I've been thinking about adding the ability to comment for a while, and have even blogged about some of the ideas I've had/seen to reduce spam and the like. You'll find the new contact form to be my experiment with the newforms library (and also a solution to putting my email out on the web, even though I've gotten plenty of spam in the email address anyway).

After I pushed this new version, I decided that my naming scheme for my various apps was becoming cumbersome more than clever. I was naming the different apps after planets in our solar system. Cute naming convention, but since this is becoming more than just a few apps, I found it difficult to remember what neptune was, why I need the earth app in this situation, and what pluto was even created for. So I obviously needed to rename these apps.

I was expecting that the process was just a matter of renaming the folders. There were obvious dependencies to worry about, and import calls to fix. So I started by moving the folders around. I then did an fgrep for all the instances of the old names. Using sed, I did a search and replace of each name. For some reason after that, my Django dev server didn't much like the environment variables I had set, and so I had to work out some problems with my environment before I could test it...

One day later, and I was back to work. I browsed around the dev server, to make sure everything was working, and noticed only one thing broken: Tags. This was an opportunity I had been waiting for, actually, and I dove headfirst into the tag database schema. The tags for this site are generated with the django-tagging app, and so I didn't have much experience with generic relations and the like, and I wanted to. I found a table called 'tagged_item' which I invesitigated, and found a reference to a content type id. I figured it must be the django_content_type foreign key, and kept digging. Apparently, django keeps a database of all the installed models, and the apps they are connected to. A few updates later, and I had tags working!

So, in summary, if you want to rename a Django app that's deployed in the field:

  1. Rename the folder found in your project root
  2. Change any references to your app in their dependencies, i.e. the app's views, the urls.py and settings.py files.
  3. Edit the database table django_content_type with the following command: UPDATE django_content_type SET app_label='<NewAppName>' WHERE app_label='<OldAppName>' (Note: for renaming models, you'll need to change django_content_type.name)

Comments on "Experience Renaming Deployed Django Apps"

On December 17, 2007 @ 12:12 Paul said...
So, you're not a spammer, because your email address is valid.  What is it about the post that you don't agree with.  

I wasn't under the impression that I was posting an opinion...
          
On December 25, 2007 @ 05:12 Charles said...
Hi,

Isn't we also have to rename table models created by using the comand:

manage.py syncdb

since those tables are prefixed with the app names, like if we have a model Post in a blog app then django will create a table named blog_post
          
On December 25, 2007 @ 17:12 Paul said...
@Charles - Yes, you are correct, and the database tables also need updating.  I just forgot to add that.  Thanks for catching it!
          
On December 15, 2007 @ 15:12 Idetrorce said...
very interesting, but I don't agree with you 
Idetrorce
          

Leave a Comment