1

I used django guardian in my project. For a reason, I added a new field to django group model with this code:

if not hasattr(Group, 'project'):
    project = models.ForeignKey(Project, on_delete=models.CASCADE, null=True, related_name='groups')
    project.contribute_to_class(Group, 'project')

So far, everything is ok. But I realized after makemigration command, django adds migration file to outside of my project directory. I want to make this file persistent. I found a solution with defining MIGRATION_MODULES in my settings.py:

MIGRATION_MODULES = {
  'auth': 'preferences.migrations' # preferences is an app of mine
}

But this time, django guardian module gives error after makemigration command. The errors are below:

Traceback (most recent call last): File "./manage.py", line 16, in execute_from_command_line(sys.argv) File "/usr/local/lib/python3.6/site-packages/django/core/management/init.py", line 381, in execute_from_command_line utility.execute() File "/usr/local/lib/python3.6/site-packages/django/core/management/init.py", line 375, in execute self.fetch_command(subcommand).run_from_argv(self.argv) File "/usr/local/lib/python3.6/site-packages/django/core/management/base.py", line 323, in run_from_argv self.execute(*args, **cmd_options) File "/usr/local/lib/python3.6/site-packages/django/core/management/base.py", line 364, in execute output = self.handle(*args, **options) File "/usr/local/lib/python3.6/site-packages/django_cassandra_engine/management/commands/makemigrations.py", line 22, in handle super(Command, self).handle(*args, **options) File "/usr/local/lib/python3.6/site-packages/django/core/management/base.py", line 83, in wrapped res = handle_func(*args, **kwargs) File "/usr/local/lib/python3.6/site-packages/django/core/management/commands/makemigrations.py", line 87, in handle loader = MigrationLoader(None, ignore_no_migrations=True) File "/usr/local/lib/python3.6/site-packages/django/db/migrations/loader.py", line 49, in init self.build_graph() File "/usr/local/lib/python3.6/site-packages/django/db/migrations/loader.py", line 274, in build_graph raise exc File "/usr/local/lib/python3.6/site-packages/django/db/migrations/loader.py", line 248, in build_graph self.graph.validate_consistency() File "/usr/local/lib/python3.6/site-packages/django/db/migrations/graph.py", line 195, in validate_consistency [n.raise_error() for n in self.node_map.values() if isinstance(n, DummyNode)] File "/usr/local/lib/python3.6/site-packages/django/db/migrations/graph.py", line 195, in [n.raise_error() for n in self.node_map.values() if isinstance(n, DummyNode)] File "/usr/local/lib/python3.6/site-packages/django/db/migrations/graph.py", line 58, in raise_error raise NodeNotFoundError(self.error_message, self.key, origin=self.origin) django.db.migrations.exceptions.NodeNotFoundError: Migration auth.0012_group_project dependencies reference nonexistent parent node ('projects', '0001_initial')

I tried add guardian to MIGRATION_MODULES definitions. But this time, migrations generated wrongly. After I tried migrate command it gives this errors:

Traceback (most recent call last): File "./manage.py", line 16, in execute_from_command_line(sys.argv) File "/usr/local/lib/python3.6/site-packages/django/core/management/init.py", line 381, in execute_from_command_line utility.execute() File "/usr/local/lib/python3.6/site-packages/django/core/management/init.py", line 375, in execute self.fetch_command(subcommand).run_from_argv(self.argv) File "/usr/local/lib/python3.6/site-packages/django/core/management/base.py", line 323, in run_from_argv self.execute(*args, **cmd_options) File "/usr/local/lib/python3.6/site-packages/django/core/management/base.py", line 364, in execute output = self.handle(*args, **options) File "/usr/local/lib/python3.6/site-packages/django_cassandra_engine/management/commands/migrate.py", line 13, in handle return super(Command, self).handle(*args, **options) File "/usr/local/lib/python3.6/site-packages/django/core/management/base.py", line 83, in wrapped res = handle_func(*args, **kwargs) File "/usr/local/lib/python3.6/site-packages/django/core/management/commands/migrate.py", line 87, in handle executor = MigrationExecutor(connection, self.migration_progress_callback) File "/usr/local/lib/python3.6/site-packages/django/db/migrations/executor.py", line 18, in init self.loader = MigrationLoader(self.connection) File "/usr/local/lib/python3.6/site-packages/django/db/migrations/loader.py", line 49, in init self.build_graph() File "/usr/local/lib/python3.6/site-packages/django/db/migrations/loader.py", line 275, in build_graph self.graph.ensure_not_cyclic() File "/usr/local/lib/python3.6/site-packages/django/db/migrations/graph.py", line 274, in ensure_not_cyclic raise CircularDependencyError(", ".join("%s.%s" % n for n in cycle)) django.db.migrations.exceptions.CircularDependencyError: users.0001_initial, accounts.0002_account_owner, projects.0001_initial, auth.0002_auto_20200426_0201, auth.0001_initial

In generated migration files, dependencies sections are(in preferences app which migration_modules definitions point):

001_initial.py:

 dependencies = [
    ('auth', '0002_auto_20200426_0201'),
    migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]

0002_auto_20200426_0201.py

dependencies = [
    ('auth', '0001_initial'),
    ('projects', '0001_initial'),
]

Where is my error? How can I solve this problem? I'm very confused.

kamilyrb
  • 2,502
  • 3
  • 10
  • 25
  • 1
    You shouldn't use this method to add fields to the `Group` model, there are quite a few potential issues with it, including the one you are having. You should instead look at adding a custom user model with a foreign key to a custom Group model https://docs.djangoproject.com/en/3.0/topics/auth/customizing/#substituting-a-custom-user-model – Iain Shelvington Apr 26 '20 at 04:39

0 Answers0