A very simple way of automatically loading data on model creation.
As I am using South I wanted an automatic way of loading initial data only when a new model is create during a migration. Django provides almost everything out of the box by providing the post_syncdb signal (triggered also by South migrate command) and the loaddata command.
The code will simply look for a an existing fixture named
<model>_initial.* and invoke the loaddata command to try to load it
Note: beware post_syncdb signal is deprecated since version 1.7: it has been replaced by post_migrate.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
import glob from django.core.management import call_command from django.db.models.signals import post_syncdb import os def fixtures_loading(sender, app, *args, **kwargs): created_models = kwargs.get('created_models', ) for model in created_models: pth = '%s/fixtures/%s_initial.*' % (os.path.dirname(app.__file__), model.__name__ ) fixtures = glob.glob( pth ) if fixtures: print "Found initial fixtures for %s fixtures:" % model.__name__, fixtures call_command('loaddata', '%s_initial' % model.__name__) post_syncdb.connect(fixtures_loading)