Django is shipped with some useful application, also there are lots of third party re-usable application written for Django. Sometime you need to modify or customize these applications(Models of application) to meet your software requirements. One of the usual solution is adding a Model class to have a one-to-one relationship with the third party Models. This solution has some disadvantages such as having more tables and classes which can highly adversely affect database performance, scalability and add more complexity to the software development.
I think of another solution to this problem. I used Django South along with monkey patching of third party Model classes. I added a field to Django user class. Here is a walk through over this approach.
1. Add an application:
python manage.py startapplication userpatch
2. Add the following code to add the new field to the user class
from django.db import models
from django.contrib.auth.models import User
User.add_to_class('open_id', models.CharField(max_length=250,blank=True))
3. Add this field to User admin interface: (This can be done in either admin.py or models.py)
from django.contrib.auth.admin import UserAdmin
UserAdmin.list_display += ('open_id',)
UserAdmin.fieldsets[0][1]['fields'] += ('open_id',)
4. add the application to INSTALLED_APP in project settings file.
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
# Uncomment the next line to enable the admin:
'django.contrib.admin',
'south',
'userpatch',
# Uncomment the next line to enable admin documentation:
# 'django.contrib.admindocs',
)
I think of another solution to this problem. I used Django South along with monkey patching of third party Model classes. I added a field to Django user class. Here is a walk through over this approach.
1. Add an application:
python manage.py startapplication userpatch
2. Add the following code to add the new field to the user class
from django.db import models
from django.contrib.auth.models import User
User.add_to_class('open_id', models.CharField(max_length=250,blank=True))
3. Add this field to User admin interface: (This can be done in either admin.py or models.py)
from django.contrib.auth.admin import UserAdmin
UserAdmin.list_display += ('open_id',)
UserAdmin.fieldsets[0][1]['fields'] += ('open_id',)
4. add the application to INSTALLED_APP in project settings file.
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
# Uncomment the next line to enable the admin:
'django.contrib.admin',
'south',
'userpatch',
# Uncomment the next line to enable admin documentation:
# 'django.contrib.admindocs',
)
5. By default South stores the migration files inside the app folder. Since we might have different app using the same Django installation we want to save these files in different location. As of South 0.7 you can define location where South access the migration files. Add the following dictionary to the project settings file change the default migration directory.
SOUTH_MIGRATION_MODULES = {
'auth': 'userpatch.migrations',
}
6. Run the schemamigration and migrate for this application.
python manage.py schemamigration userpatch --auto
python manage.py migrate userpatch
NOTE: I assumed that you have already added the application to South.
Insightful post!
ReplyDelete