Search code examples
djangodjango-migrationsdjango-permissions

Adding django admin permissions in a migration: Permission matching query does not exist


I wanted to add some groups and assign permissions to them in a manually written migration but if I run it on a clean DB it creates permissions only after running all migrations.

I've found this ticket: https://code.djangoproject.com/ticket/23422 but I cannot comment there (it's possible I was banned after expressing some discontent with GeoDjango docs), so I'll share an improvement over the solution there below.


Solution

  • Django <= 1.9

    see another answer for Django 1.10+

    It's enough to call create_permissions:

    from django.contrib.auth.management import create_permissions
    
    apps.models_module = True
    create_permissions(apps, verbosity=0)
    apps.models_module = None
    

    The whole migration being something like this

    # coding:utf-8
    from django.db import migrations
    from django.contrib.auth.models import Permission, Group
    from django.contrib.auth.management import create_permissions
    from django.contrib.contenttypes.models import ContentType
    from django.conf import settings
    
    MODERATORS_PERMISSIONS = ['change_modelname', ]
    
    
    def add_permissions(apps, schema_editor):
        apps.models_module = True
        create_permissions(apps, verbosity=0)
        apps.models_module = None
    
        moderators_group = Group.objects.get_or_create(
            name=settings.MODERATORS_GROUP)[0]
        for codename in MODERATORS_PERMISSIONS:
            permission = Permission.objects.get(codename=codename)
            moderators_group.permissions.add(permission)
    
    
    class Migration(migrations.Migration):
    
        dependencies = [
            ('contenttypes', '0002_remove_content_type_name'),
            ('thisappname', '0001_initial'),
        ]
    
        operations = [
            migrations.RunPython(add_permissions),
        ]