django: data migrate permissions

后端 未结 3 1773
自闭症患者
自闭症患者 2021-01-12 20:47

I have a bunch of new permissions which I need to migrate. I tried doing it through data migration but complains about ContentType not being available.

相关标签:
3条回答
  • 2021-01-12 21:12

    Here are steps for adding custom permissions to the User model:

    First create a migration file, for example under your authentication application,

    Here i named it 0002_permission_fixtures.py:

    account (your authentication application)
     |_migrations
       |__ 0001_initial.py
       |__ 0002_permission_fixtures.py
       |__ __init__.py
    

    Then adding your permission objects, as follow:

    # -*- coding: utf-8 -*-
    from __future__ import unicode_literals
    from django.db import migrations
    
    
    def forwards_func(apps, schema_editor):
        # Get models that we needs them
        user = apps.get_model("auth", "User")
        permission = apps.get_model("auth", "Permission")
        content_type = apps.get_model("contenttypes", "ContentType")
        # Get user content type object
        uct = content_type.objects.get_for_model(user)
        db_alias = schema_editor.connection.alias
        # Adding your custom permissions to User model: 
        permission.objects.using(db_alias).bulk_create([
            permission(codename='add_sample', name='Can add sample', content_type=uct),
            permission(codename='change_sample', name='Can change sample', content_type=uct),
            permission(codename='delete_sample', name='Can delete sample', content_type=uct),
        ])
    
    
    class Migration(migrations.Migration):
        dependencies = [
        ('contenttypes', '__latest__'),
                ]
    
        operations = [
            migrations.RunPython(
                forwards_func,
            ),
        ]
    

    To run this migration, first migrate contenttype model, and then migrate your application (here is account).

    $ python manage.py migrate contenttypes
    $ python manage.py migrate account
    
    0 讨论(0)
  • 2021-01-12 21:14

    Here is a quick and dirty way to ensure all permissions for all apps have been created:

    def add_all_permissions():
        from django.apps import apps
        from django.contrib.auth.management import create_permissions
    
        for app_config in apps.get_app_configs():
            app_config.models_module = True
            create_permissions(app_config, verbosity=0)
            app_config.models_module = None
    
    0 讨论(0)
  • 2021-01-12 21:28

    There are 2 ways to solve this:

    1) The ugly way:

    Run manage.py migrate auth before your wanted migration

    2) Recommended way:

    from django.contrib.auth.management import create_permissions
    
    def add_permissions(apps, schema_editor):
        apps.models_module = True
    
        create_permissions(apps, verbosity=0)
        apps.models_module = None
    
        # rest of code here....
    
    0 讨论(0)
提交回复
热议问题