Search code examples
pythondjangodjango-1.6django-fixturesloaddata

Django 1.6: How to ignore a fixture in python manage.py loaddata?


I need an answer for this, right now im doing this command:

python manage.py loaddata app/myapp/fixtures/* --settings=setting.develop

This works fine, but now i want to do this same command but ignoring or skiping a simple file inside app/myapp/fixtures/ so i don't want to write one loaddata for every fixture inside, i wanted to make only one command and use something like --exclude or --ignore or some kind of way to do it in one line and keep the /* to go agains all the files inside.

Thanks in advance!


Solution

  • Writing your own management command in Django is simple; and inheriting from Django's loaddata command makes it trivial:

    excluding_loaddata.py

    from optparse import make_option
    
    from django.core.management.commands.loaddata import Command as LoadDataCommand
    
    
    class Command(LoadDataCommand):
        option_list = LoadDataCommand.option_list + (
            make_option('-e', '--exclude', action='append',
                        help='Exclude given fixture/s from being loaded'),
        )
    
        def handle(self, *fixture_labels, **options):
            self.exclude = options.get('exclude')
            return super(Command, self).handle(*fixture_labels, **options)
    
        def find_fixtures(self, *args, **kwargs):
            updated_fixtures = []
            fixture_files = super(Command, self).find_fixtures(*args, **kwargs)
            for fixture_file in fixture_files:
                file, directory, name = fixture_file
    
                # exclude a matched file path, directory or name (filename without extension)
                if file in self.exclude or directory in self.exclude or name in self.exclude:
                    if self.verbosity >= 1:
                        self.stdout.write('Fixture skipped (excluded: %s, matches %s)' %
                                          (self.exclude, [file, directory, name]))
                else:
                    updated_fixtures.append(fixture_file)
            return updated_fixtures
    

    usage:

    $ python manage.py excluding_loaddata app/fixtures/* -e not_this_fixture